Почему g ++ заставляет мой код выполняться в другом порядке, чем написано, и как отключить эту «оптимизацию»? - PullRequest
0 голосов
/ 21 января 2012

Например:

#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;
}

при выполнении запускает строку 3 (и, возможно, строку 4) перед строкой 2. Теперь я знаю, что это, вероятно, хорошая функция оптимизации, но иногда необходим правильный порядок.

Ответы [ 3 ]

10 голосов
/ 21 января 2012

Проблема здесь:

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

Во многих архитектурах вы буферизировали вывод, что означает, что то, что вы печатаете на экране, отображается не сразу, а в буфере памяти.Чтобы очистить буфер и убедиться, что он напечатан немедленно, вы можете использовать

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

, хотя я не нашел ничего, чтобы доказать это, кроме личного опыта, или, наоборот, если вы не хотите идти вновую строку (и будьте абсолютно уверены в том, что она очищена), вы можете использовать fflush(stdout) сразу после строки 2.

3 голосов
/ 21 января 2012

В 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;
}
3 голосов
/ 21 января 2012
Флаг

-O0 отключает все оптимизации в GCC.

Но наблюдаемый эффект, скорее всего, связан не с оптимизацией, а с буферизацией файлового ввода-вывода.

Вставка fflush (stdout) сразу после printf (...) заставит систему ввода-вывода очистить буфер, который в случае входа в файл должен дать вам правильный порядоксобытия (при условии, что вы регистрируете malloc () вызовов в один и тот же файл, и именно здесь вы наблюдаете события не по порядку).

...