При отладке некоторого устаревшего кода я наткнулся на удивительное (для меня) поведение компилятора. Теперь я хотел бы знать, не имеет ли какое-либо предложение в спецификации С++ следующую оптимизацию, где игнорируются побочные эффекты от вызова функции при условии:
void bar()
{
extern int upper_bound;
upper_bound--;
}
void foo()
{
extern int upper_bound; // from some other translation unit, initially ~ 10
for (int i = 0; i < upper_bound; ) {
bar();
}
}
В полученном результате есть путь управления, в котором upper_bound
сохраняется в регистре, а декремент upper_bound
в bar()
никогда не вступает в силу.
Мой компилятор - Microsoft Visual С++ 11.00.60610.1.
Честно говоря, я не вижу много места для маневра в 6.5.3 и 6.5.1 N3242, но я хочу быть уверенным, что я не пропущу что-то очевидное.