【发布时间】:2013-05-14 00:51:27
【问题描述】:
我知道编译器优化有时会导致堆栈帧波动。所以我的问题是,在 c++ 中创建堆栈指针并将其传递给另一个函数并期望它指向被调用者中的同一个对象是否总是安全的。由于编译器优化,是否有可能最终指向一个意外的位置。
例如,这对于任何编译器来说总是安全的吗?
int main(){
std::ofstream f("somefile");
foo(&f);
return 0;
}
或者我应该使用堆来获得一致的结果。
int main(){
std::ofstream *f=new std::ofstream("somefile");
foo(f);
close(*f);
delete f;
return 0;
}
【问题讨论】:
-
您的第一个示例甚至无法编译。
-
优化不应该将正确的代码转换为不正确的代码(编译器从正确的代码生成不正确的程序是有问题的)。您可能关心的是:“我的代码是否正确,编译器优化会产生正确的结果”。
-
@LucDanton 你有没有听说过程序员抱怨他们的代码在一个系统上工作多年,然后突然停止工作,要么是因为新的系统/编译器,要么是编译器的行为不同?
-
@MoZo:只有当编译器或代码包含错误时才会发生这种情况。如果代码不正确,则无论是否仅在使用优化编译器时才显示都是不正确的,如果代码正确,则如果优化后没有产生正确的结果,则是编译器中的错误。 Luc Danton 指出“因为编译器优化”并不是代码从正确变为错误的正当理由。
-
请注意,我说的是“正确的代码”,而不是“有效的代码”。这也应该是您关心的问题之一! (总而言之,我并不是说没有错误的编译器或工具;但您无法通过编码摆脱这些。)
标签: c++ object heap-memory stack-memory