【发布时间】:2012-06-22 23:18:20
【问题描述】:
只是出于我自己的好奇心而提出的问题。我多次听说在编写方法时最好使用复制/销毁范式。所以如果你有这样的方法:
OtherClass MyClass::getObject(){
OtherClass returnedObject;
return returnedObject;
}
假设编译器将通过内联方法并在调用getObject的方法的堆栈上生成类来优化这一点。我想知道在这样的循环中如何工作
for(int i=0; i<10; i++){
list.push_back(myClass.getObject());
}
编译器是否会将 10 个 OtherClass 实例放在堆栈上,以便可以内联此方法并避免在未优化的代码中发生的复制和破坏?像这样的代码呢:
while(!isDone){
list.push_back(myClass.getObject());
//other logic which decides rather or not to set isDone
}
在这种情况下,编译器不可能知道getObject 将被调用多少次,因此可以推测它可以将任何内容预分配到堆栈中,所以我的假设是没有进行内联并且每次调用该方法时我将支付复制OtherObject的全部费用?
我意识到所有编译器都是不同的,这取决于编译器是否认为该代码是最佳的。我只是笼统地说,大多数编译最有可能如何响应?我很好奇这种优化是如何完成的。
【问题讨论】:
-
将内联视为代码复制+粘贴。如果可以复制/粘贴,则可以内联。编译器是否会在特定情况下这样做是另一回事。
-
otherClass returnedObject();构造什么都不做 - 不会创建任何对象 -
@sharptooth - 已编辑以删除错误,因为这对他的问题不是必需的。
-
我认为您有两个潜在的优化需要查看:内联和循环展开。您还可以查看 c++11 中的 std::vector::emplace_back() 。最后,尝试制作一个示例并在各种优化级别对其进行编译。
标签: c++ optimization compiler-construction