Странная ошибка оптимизации GCC

0

Я пишу довольно большое приложение, содержащее множество разных модулей. Я всегда программировал с включенной информацией отладки GCC, и все оптимизации отключены по очевидным причинам отладки. Теперь я решил, что настало время для выпуска, и я настроил GCC на оптимальные возможности (-O3). И вот когда появился самый странный из ошибок. Возьмите следующий код:

void SomeClass::setValue(int i) { this->iValue = i; }
int  SomeClass::getValue() const { return this->iValue; }

Теперь без оптимизаций они работают отлично. С оптимизацией значение SomeClass.iValue не изменяется в setValue(). Фактически, вывод следующего:

cout << x.getValue();
x.setValue(5);
cout << x.getValue();

возвращается

0
0

когда iValue инициализируется в классе до 0.

Теперь странная часть: если я вставляю следующий код в setValue():

void SomeClass::setValue(int i) { cout << "Narf"; this->iValue = i; }

код работает!

Может кто-нибудь, пожалуйста, объясните мне, что происходит?

  • 3
    void SomeClass::getValue() const - почему void и const ? должен быть int ?
  • 0
    Является ли iValue статическим членом? Похоже на то, как вы используете его в этих функциях.
Показать ещё 6 комментариев
Теги:
optimization
gcc

2 ответа

2

вы пытались проверить cout<<x.iValue; ? возможно, проблема в SomeClass::getValue(); например, он возвращает void или const? :)

также, просто идея, оптимизация может произойти в cout не ваш фактический код, как намечено cout << "Narf";

  • 1
    getValue() является getValue() , поэтому он прекрасно работает как функция-член const. И тип возвращаемого значения, скорее всего, был набран неверно, так как компилятор не допустил бы, чтобы функция void возвращала int.
  • 0
    1+, idk, может, оптимизатор совершает какое-то волшебство против констант? моя точка зрения в том, что он не проверяет, изменилось ли значение, только вывод функции, это может помочь определить, где ошибка, потому что код в вопросе, вероятно, имеет мало общего с реальным кодом ..
Показать ещё 1 комментарий
1

Во-первых, ваш код не совсем корректен. Функция Getter должна возвращать int вместо void. Я думаю, вы просто набрали его неправильно здесь, потому что gcc не позволит вам скомпилировать это (std :: cout не имеет перегруженного оператора << для типа void). Более того, SomeClass.i_value также не компилируется. Вы this->i_value виду this->i_value или просто i_value?

  • 0
    Да, это не пустота, это опечатка. Так как SomeClass вместо этого ->. Я просто очень устал, извините за это.
  • 1
    Ну, -O3 не лучший флаг оптимизации, особенно для больших проектов. Это самый сильный, но он может закончиться даже в segfaults (т. Е. Путем встраивания функций, которые не являются явно встроенными). Иногда это может даже привести к тому, что результирующий двоичный файл будет больше, чем -O2. Лучшие флаги имхо -O2 или даже -Os.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню