Отключение определенной оптимизации (удаление мертвого кода) в компиляторе gcc - PullRequest
2 голосов
/ 24 января 2012

Я бы хотел отключить оптимизацию удаления мертвого кода в компиляции c ++. Есть ли способ отключить эту конкретную оптимизацию, сохранив все остальные -O оптимизации. Я пытался с -fnodce, но он не работает.

Обновление (скопировано из комментария): У меня есть что-то вроде

timer t;
t.start();
for(int i=1;i<=1000;++i)
    object t;
t.stop();

Я хочу измерить время строительства t и ничего не делать с ним. Я не хочу делать это, создавая массив из 1000 объектов. Есть ли способ решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 24 января 2012

Ну, если вы просто хотите измерить время инициализации ваших объектов, зачем пытаться принудить компилятор избегать DCE и все такое, а не просто записать его таким образом, чтобы избежать проблемы в первую очередь?

object *arr = new object[100];   // allocate that outside the function and pass it into it
for (int i = 0; i < 100; i++) {
    arr[i] = new object;
}

Если функция достаточно велика, чтобы избежать встраивания, это должно сработать, иначе вы можете экспортировать функцию и вызывать ее из другого модуля компиляции, чтобы избежать нежелательных оптимизаций.Все просто, никаких хитростей с некоторыми флагами компилятора, которые могут иметь непредвиденные последствия, и единственные издержки - это хранение массива - если ТО измеримо влияет на ваше время, вы все равно измеряете неправильные вещи.

Или если вам действительно нужен какой-то компиляторспециальные флаги - у gcc есть атрибут noinline ..

0 голосов
/ 24 января 2012

Добавьте спецификатор «volatile» на построенные объекты, это говорит компилятору предположить, что у конструкции есть побочные эффекты, предотвращающие ее оптимизацию.То есть:

timer t; 
t.start(); 
for(int i=1;i<=1000;++i) 
  volatile object t; 
t.stop(); 
...