C11编译器在代码优化期间可以将局部变量转换为rvalue吗?

有时将复杂或长的表达式分解成多个步骤是明智的,例如(第二个版本不太清楚,但这只是一个例子):

return object1(object2(object3(x)));

可以写成:

object3 a(x);
object2 b(a);
object1 c(b);
return c;

假设所有3个类都实现以rvalue为参数的构造函数,则第一个版本可能会更快,因为临时对象被传递并可以被移动。我假设在第二版中,局部变量被认为是左值。但是如果这些变量不再被使用,C 11编译器会优化代码,所以这些变量被认为是右值,两个版本的工作是完全相同的。我主要对Visual Studio 2013的C编译器感兴趣,但是我也很高兴知道GCC编译器在这个问题上的行为。

谢谢,
米哈尔

在这种情况下,编译器无法打破“as-if”规则。但是你可以使用std :: move来达到预期的效果:

object3 a(x);
object2 b(std::move(a));
object1 c(std::move(b));
return c;
http://stackoverflow.com/questions/21830894/do-c11-compilers-turn-local-variables-into-rvalues-when-they-can-during-code-o

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:C11编译器在代码优化期间可以将局部变量转换为rvalue吗?