Я пишу довольно большое приложение, содержащее множество разных модулей. Я всегда программировал с включенной информацией отладки 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; }
код работает!
Может кто-нибудь, пожалуйста, объясните мне, что происходит?
вы пытались проверить cout<<x.iValue;
? возможно, проблема в SomeClass::getValue();
например, он возвращает void
или const
? :)
также, просто идея, оптимизация может произойти в cout не ваш фактический код, как намечено cout << "Narf";
getValue()
является getValue()
, поэтому он прекрасно работает как функция-член const. И тип возвращаемого значения, скорее всего, был набран неверно, так как компилятор не допустил бы, чтобы функция void возвращала int.
Во-первых, ваш код не совсем корректен. Функция Getter должна возвращать int вместо void. Я думаю, вы просто набрали его неправильно здесь, потому что gcc не позволит вам скомпилировать это (std :: cout не имеет перегруженного оператора << для типа void). Более того, SomeClass.i_value
также не компилируется. Вы this->i_value
виду this->i_value
или просто i_value
?
void SomeClass::getValue() const
- почемуvoid
иconst
? должен бытьint
?iValue
статическим членом? Похоже на то, как вы используете его в этих функциях.