通过构造函数中的值或常量引用传递的参数
Argument passed by value or const reference in the constructor
哪个构造函数更适合下面的类?
struct Foo
{
Foo(const int& val):val_(val){} // constructor 1
Foo(int val):val_(val){} // constructor 2
int val_;
};
在没有任何编译器优化的情况下,他们是只复制val一次,还是构造函数2在初始化列表之前创建另一个副本?
如果调用了第一个构造函数,则传递给它的参数将不会被复制。val
参数将绑定到传递的参数(通过引用复制)。
如果调用第二个构造函数,则传递给它的参数将被值复制。
两个构造函数的相同之处在于,它们分别用val
初始化_val
,并按值执行额外的复制。
因此,在没有任何优化的情况下,它看起来是这样的:
Copies
const int& constructor 1
int constructor 2
基本上,构造函数2会复制两次:第一次在调用时,第二次在初始化时。另一方面,您知道引用只不过是一个指针,并且当引用变量的大小减小到指针大小时,构造函数1和2之间的成本不会降低。
通常,您不需要通过const引用传递int
变量。
真正的问题是:你为什么在乎?如果Foo
是在一个迭代次数非常多的循环中构建的,那么只有可测量的速度差异,这几乎是该循环中唯一发生的事情——非常不可能。
所以只需使用#2。不是因为效率,而是因为它更简单。
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 具有常量引用参数的函数模板专用化
- C++:常量引用参数
- 字符串引用参数的效率C++
- 通过非常量引用参数修改常量引用参数
- 如何将指针变量作为引用参数传递?
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 移动类的成员作为常量引用参数传递
- C++带有适用于左值和右值的引用参数的函数
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- 如何使用类型特征将函数的通用引用参数限制为 r 值引用?
- 委托构造函数和引用参数
- 对 const 引用参数使用默认值会导致崩溃
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 将非左值作为常量引用参数传递.临时是在本地作用域还是在调用方作用域中创建的?
- 如何强制函数仅接受左值引用参数
- 模板引用参数推断失败C++
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 将unique_ptr作为引用参数或常量传递unique_ptr引用