我一直被告知(并且一直在告诉)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带有非默认复制/移动构造函数的对象实际上会产生性能损失,而不是在遇到这种省略的情况时会增加性能吗?
这是否意味着将 const 对象与非默认复制/移动构造函数一起使用实际上会带来性能损失
可能是的。当返回本地对象时,常量将阻止使用引用规则允许的移动构造。但实际上,性能损失可能不存在,因为无论变量是否为 const,NRVO 仍可能会忽略整个复制/移动。
但 NRVO 并不能得到保证,并且不一定总是可能的 - 或者只是未启用(调试版本),因此在按值返回局部变量时使用非 const 可能是值得的。
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |