是否将const ref传递的模板化参数优化为在足够小的情况下按值传递?

问题描述 投票:0回答:1

[当标准函数不修改而接受模板化参数时,似乎总是采用const ref(例如:std::vector::insert)。

这是否意味着bool参数之类的函数将变为std::vector<bool>::insert(const bool& value)

或者是否有一些优化使其改为std::vector<bool>::insert(bool value)?如果是,我自己的模板函数也会从中受益吗?

c++ templates parameter-passing
1个回答
1
投票

[std::vector是模板,因此,根据定义,std::vector<bool>::insert()inline

[现代编译器可以轻松地“透视” inline调用中的引用并将它们全部优化。

对于像int这样的小对象,通过引用和按值传递之间没有区别。

示例:

struct A {
    int func1(const int& x) { return x + 1; }
    int func2(int y) { return y + 1; }
};

int func1(int x) {
    A a;
    return a.func1(x);
}

int func2(int y) {
    A a;
    return a.func2(y);
}

生成的代码(godbolt link):

func1(int):                              # @func1(int)
        lea     eax, [rdi + 1]
        ret
func2(int):                              # @func2(int)
        lea     eax, [rdi + 1]
        ret

如果您要通过共享库公开API,则then传递按引用可能会导致额外的取消引用。这是因为在C ++ ABI中,传递引用实际上是通过指针进行的。但是对于inline调用,这通常不是问题。

另一方面,如果复制或使用对象带来副作用,则按值传递large对象可能不容易优化。因此,对于通用模板,通过引用传递是明智的设计选择。

© www.soinside.com 2019 - 2024. All rights reserved.