0

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

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

在没有任何编译器优化的情况下,它们是仅复制 val 一次还是构造函数 2 在初始化列表之前创建进一步的副本?

4

3 回答 3

2

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

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

两个构造函数的相同之处在于它们分别初始化_val并按值val执行额外的复制

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

                                                    Copies
const int& constructor          1
int constructor                          2
于 2015-11-04T16:48:18.717 回答
1

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

于 2015-11-04T16:50:09.983 回答
1

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

真正的问题是:你为什么在乎?Foo如果在具有非常多迭代的循环内构建,则只会存在可测量的速度差异,并且这几乎是该循环内唯一发生的事情 - 不太可能。

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

于 2015-11-04T16:57:22.050 回答