C++ 哪些因素决定是否使用(N)VRO?

C++ 哪些因素决定是否使用(N)VRO?,c++,rvo,nrvo,C++,Rvo,Nrvo,(不幸的是,受此启发是主观的) 哪些因素影响编译器是否选择应用(N)VRO 我知道有两大类因素,因为优化器需要回答关于(N)VRO决策的两个问题:(1)这是否可能,以及(2)这是否是一个优化?我希望每个因素只适用于这两个问题中的一个 请不要对优化部分进行毫无根据的猜测。当您可以确切地解释它如何影响优化时,或者当您可以列出一个由现有编译器使用的因子时,可以列出一个因子。但是,在没有解释这如何影响申请(N)Visa在线争议处理组织的决定之前,不要说sizeof(t)。官方术语是复制省略。这显然是一个

(不幸的是,受此启发是主观的)

哪些因素影响编译器是否选择应用(N)VRO

我知道有两大类因素,因为优化器需要回答关于(N)VRO决策的两个问题:(1)这是否可能,以及(2)这是否是一个优化?我希望每个因素只适用于这两个问题中的一个


请不要对优化部分进行毫无根据的猜测。当您可以确切地解释它如何影响优化时,或者当您可以列出一个由现有编译器使用的因子时,可以列出一个因子。但是,在没有解释这如何影响申请(N)Visa在线争议处理组织的决定之前,不要说
sizeof(t)

官方术语是复制省略。这显然是一个优化,因为当它应用时,什么都不会发生。只有当拷贝省略没有发生时,运行时操作才会发生。你没有比不使用更好的了。如果有人能想出一个例子,说明应用
-fno-elide构造函数可以提高性能,这将是一件很有趣的事情。我不确定问题的“这是优化吗”部分。在适当的位置构建一个对象肯定是对构建然后移动或复制它的优化,不是吗?即使这个操作非常便宜,但根本不做它仍然是一种优化。@Damon:单独来看,是的-但这可能会影响另一种优化,迫使编译器选择。为什么它(或者应该)必须这样做?如果一个函数的结果是,比如说,循环不变量,那么为什么编译器没有执行另外一个或两个额外的副本,这一事实会阻止它将不变量移动到循环之外的另一个地方呢?函数调用周围有序列点,所以根据定义。。。没有干扰?@Damon:嗯,函数可能没有将对象存储在连续内存中(根据“仿佛”规则允许)。