在构造函数中按值或 const 引用传递的参数
Argument passed by value or const reference in the constructor
以下class哪种构造函数比较好?
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。不是因为效率而是因为它更简单。
以下class哪种构造函数比较好?
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。不是因为效率而是因为它更简单。