为什么g ++使我的代码以不同于写入的顺序执行,如何禁用这种“优化”?

时间:2012-01-21 09:52:06

标签: c++ g++ compiler-optimization

例如:

#include <stdio.h>
#include <string>
int main() {
    std::string* stuff(NULL);

    printf("allocating memory..."); //line 2

    stuff = new std::string[500000000]; //line 3

    delete [] stuff; //line 4

    return 0;
}

执行时在第2行之前运行第3行(可能还有第4行)。现在我知道这可能是一些很好的优化功能,但有时需要正确的顺序。

3 个答案:

答案 0 :(得分:10)

问题在于:

printf("allocating memory..."); //line 2

在许多架构中,您都有缓冲输出,这意味着您在屏幕上打印的内容不会立即显示,而是存储在内存缓冲区中。要刷新缓冲区并确保立即打印,可以使用

printf("allocating memory...\n"); //line 2 with the \n character that flushes the buffer

虽然除了个人经验之外我没有找到任何证明这一点的东西,或者,如果你不想去新的一行(并且绝对确定要冲洗),你可以立即使用fflush(stdout)第2行。

答案 1 :(得分:3)

-O0 标志禁用GCC中的所有优化。

但您观察到的效果很可能不是由于优化而是由于文件IO缓冲造成的。

printf(...)之后插入 fflush(stdout)将使IO系统刷新缓冲区,以便在记录到文件时给你正确的权利事件顺序(假设您正在记录 malloc()对同一文件的调用,这是您观察无序事件的地方)。

答案 2 :(得分:3)

在C ++中,您可能希望这样写:

#include <iostream>
#include <string>
int main() {
    std::string* stuff(NULL);

    std::cout << "allocating memory..."; //line 2
    std::cout.flush();   // ensures the buffer is actually written to the terminal right here

    stuff = new std::string[500000000]; //line 3

    delete [] stuff; //line 4

    return 0;
}