在GCC中,有没有任何警告可以使我们知道是否执行了NRVO/RVO?
我发现-fno-elide-constructors
会关闭NRVO/RVO,但NRVO/RVO有它自己的发生条件,有时候不会发生。为了理解额外的复制构造函数何时发生,需要知道NRVO/RVO是否发生。
我特别关注编译时特性。如果有一些特定的#pragma GCC...
(激活紧随其后的诊断)或使用静态断言机制的东西,那就太好了。
在GCC中,有没有任何警告可以使我们知道是否执行了NRVO/RVO?
我发现-fno-elide-constructors
会关闭NRVO/RVO,但NRVO/RVO有它自己的发生条件,有时候不会发生。为了理解额外的复制构造函数何时发生,需要知道NRVO/RVO是否发生。
我特别关注编译时特性。如果有一些特定的#pragma GCC...
(激活紧随其后的诊断)或使用静态断言机制的东西,那就太好了。
#include <iostream>
#include <vector>
std::vector<int> testNRVO(int value, size_t size, const std::vector<int> **localVec)
{
std::vector<int> vec(size, value);
*localVec = &vec;
/* Do something here.. */
return vec;
}
int main()
{
const std::vector<int> *localVec = nullptr;
std::vector<int> vec = testNRVO(0, 10, &localVec);
if (&vec == localVec)
std::cout << "NRVO was applied" << std::endl;
else
std::cout << "NRVO was not applied" << std::endl;
}
启用/禁用-fno-elide-constructors
会按预期更改打印的消息。请注意:在严格意义上,当(N)RVO未发生时,指针比较可能取决于未定义的行为,因为本地自动对象不存在。
进行指针比较会增加冗余代码,但具有与编译器无关的优点。
-Winline
这样的警告,这是很奇怪的。 - Tomilov Anatoliy-Wdisabled-optimization
是否可行?我无法使用-fdump-tree-nrv
获得任何.nrv
输出文件,并且似乎不存在-fopt-info-nrv-missed
/-fopt-info-missed-nrv
。 - Tomilov Anatoliy.nrv
文件放在.o
文件旁边——更大的挑战是阅读这个混乱的文件,因为它们不是非常人性化的文件。我自己只用过-Wdisabled-optimization
一两次,因为噪音太烦人了,而回报很少。尽管当时它似乎工作得很好(对于它所做的事情)。 - Damontree-nrv
用于基本的、晚期的、与语言无关的优化,而不是 C++ 中较早出现在前端的强 N?RVO。在 GCC 的 bugzilla 上提交 RFE 是有道理的。 - Marc Glisse