在什么条件下现代c ++编译器不执行rvo?

Mys*_*tor 5 c++ optimization clang rvo nrvo

出于性能原因,我有兴趣确保在函数的返回值上执行RVO.什么会阻止这个优化由现代C++编译器(如gcc,clang和msvc 2015)执行,我应该担心什么?

澄清编辑:我感兴趣的是识别(希望最终通过某种形式的静态分析,但后来可能会出现)当从函数返回具有昂贵的复制构造函数(但是廉价的移动构造函数)的特定值时,不执行RVO(意味着正在执行不必要的复制构造函数调用).当std :: move()调用可以避免这种昂贵的操作时尤其如此.

我特别感兴趣的是它实际上由编译器执行的情况,而不是C++ 11规范允许的情况,我认为它比实际实现的情况更广泛.我也对编译器自动使用移动构造函数而不是复制构造函数(如果允许)的情况感兴趣.