gpt4 book ai didi

c++ - const ref 传递的模板化参数是否优化为在足够小时按值传递?

转载 作者:行者123 更新时间:2023-11-30 03:13:13 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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,然后按引用传递可能会导致额外的取消引用。那是因为在 C++ ABI 中,按引用传递实际上是通过指针发生的。但是对于 inline这通常不是问题。

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

关于c++ - const ref 传递的模板化参数是否优化为在足够小时按值传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58912240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com