为什么以下C++代码片段未触发move semantics移动构造函数?
C++移动构造函数未触发原因说明
根因:编译器返回值优化(RVO)
你观测到的现象是C++标准允许的拷贝消除(Copy Elision) 优化的典型表现:
- 你的
getStr函数直接返回string类型的临时纯右值对象,Visual Studio 2019在默认编译配置下会执行返回值优化,直接在main函数中变量s的内存地址上构造最终的string对象,完全跳过临时对象构造、移动构造的调用流程。 - C++标准明确允许编译器执行这类优化,哪怕移动/拷贝构造函数存在打印日志这类副作用,优化行为也符合标准要求。
补充说明
- 你使用的C14标准中,这类场景的拷贝消除是编译器可选优化项;如果升级到C17及以上标准,返回纯右值的拷贝消除属于强制要求,哪怕关闭优化也不会触发移动构造调用。
- 如果你需要在当前环境下触发移动构造,可以通过两种方式实现:
- 关闭VS2019的RVO优化:进入项目属性→C/C→优化,设置优化等级为
禁用(/Od),部分版本还需要在C/C→命令行中添加额外参数/d2:-RVO强制禁用返回值优化。 - 修改代码让编译器无法执行RVO,示例如下:
- 关闭VS2019的RVO优化:进入项目属性→C/C→优化,设置优化等级为
string getStr() { string str1("hello"); string str2("world"); // 运行时才能确定返回值,编译器无法做RVO return rand() % 2 == 0 ? str1 : str2; }
修改后重新编译运行,就可以看到移动构造函数的打印输出。
内容的提问来源于stack exchange,提问作者biluochun2010
相关产品推荐
相关产品推荐

