例如:
#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行)。现在我知道这可能是一些很好的优化功能,但有时需要正确的顺序。
答案 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;
}