在构造函数

时间:2015-11-04 16:46:36

标签: c++ constructor pass-by-value pass-by-const-reference

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

struct Foo
{ 
  Foo(const int& val):val_(val){} // constructor 1    
  Foo(int val):val_(val){} // constructor 2
  int val_;
};

没有任何编译器优化,他们只复制val一次还是构造函数2在初始化列表之前创建了另一个副本?

3 个答案:

答案 0 :(得分:1)

如果调用第一个构造函数,传递给它的参数将被复制。 val参数将绑定到传递的参数(按引用复制)。

如果调用第二个构造函数,传递给它的参数将按值复制

两个构造函数都是相同的,因为它们分别用_val初始化val并按值执行额外的复制。

所以,没有任何优化,它看起来像这样:

                                                    Copies
const int& constructor          1
int constructor                          2

答案 1 :(得分:1)

基本上,构造函数2将复制两次:第一次调用,第二次进行初始化。 另一方面,您理解引用只不过是一个指针,并且随着引用变量的大小减小到指针大小,在第1和第2个结构之间不会降低成本。

答案 2 :(得分:1)

通常,您永远不需要通过const引用传递int个变量。

真正的问题是:你为什么关心?如果Foo在具有很多迭代的循环中构造,那么只有可测量的速度差它几乎是在该循环中发生的唯一事情 - 非常不可能。

所以只需使用#2。不是因为效率,而是因为它更简单。