非平凡变量的常量正确性

Som*_*ken 5 c++ copy-elision

(尽管与无关,但仍受此答案的启发)

我一直被告知(并且一直在告诉)const,即使对于寿命很短的变量,保持- 正确性也是有价值和良好的做法,例如:

const std::string a = "Hello world";
Run Code Online (Sandbox Code Playgroud)

代替

std::string a = "Hello world";
Run Code Online (Sandbox Code Playgroud)

这个:

  • 表达意图更清晰。
  • 确保变量是不可变的,因此将其传递给可能会更改它的某些函数将使编译器对您大吼大叫。
  • 由于编译器的优化,可能会提高性能。

尽管自从现代C ++引入复制省略功能以来,标准中已有一些子句允许编译器调用move构造函数而不是复制构造函数:

在以下复制初始化上下文中,可以使用移动操作代替复制操作:

(3.1) 如果return语句([stmt.return])中的表达式是一个(可能带有括号的)id表达式,该对象使用在最里面的封闭函数或lambda的主体或参数声明子句中声明的具有自动存储期限的对象进行命名-表达式,或

3.2) 如果throw-expression[[expr.throw])的操作数是非易失性自动对象(函数或catch子句参数除外)的名称,其范围不会超出最内层封闭的结尾try-block(如果有一个),

这是否意味着使用const带有非默认复制/移动构造函数的对象实际上会产生性能损失,而不是在遇到这种省略的情况时会增加性能吗?

eer*_*ika 3

这是否意味着将 const 对象与非默认复制/移动构造函数一起使用实际上会带来性能损失

可能是的。当返回本地对象时,常量将阻止使用引用规则允许的移动构造。但实际上,性能损失可能不存在,因为无论变量是否为 const,NRVO 仍可能会忽略整个复制/移动。

但 NRVO 并不能得到保证,并且不一定总是可能的 - 或者只是未启用(调试版本),因此在按值返回局部变量时使用非 const 可能是值得的。