通过构造函数中的值或常量引用传递的参数

Argument passed by value or const reference in the constructor

本文关键字:引用 参数 常量 构造函数      更新时间:2023-10-16

哪个构造函数更适合下面的类?

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。不是因为效率,而是因为它更简单。