Правило "как если бы" в основном определяет, какие преобразования разрешено выполнять реализации в допустимой программе на C++. Короче говоря, разрешены все преобразования, не влияющие на наблюдаемое поведение программы.
Что именно означает "наблюдаемое поведение", cppreference.com, по-видимому, имеет другое определение, чем то, которое дано в Стандарте, относительно ввода/вывода. Я не уверен, является ли это переосмыслением Стандарта или ошибкой.
Правило «как если бы» от cppreference.com:
- Все операции ввода и вывода происходят в том же порядке и с тем же содержанием, как если бы программа выполнялась так, как она написана.
Правило «как если бы» стандарта:
- Динамика ввода и вывода интерактивных устройств должна происходить таким образом, чтобы подсказка вывода фактически доставлялась до того, как программа ожидает ввода. Что представляет собой интерактивное устройство, определяется реализацией
Это различие важно для меня, потому что я хочу знать, является ли обычное переупорядочивание хранилища допустимой оптимизацией компилятора или нет. Согласно формулировке cppreference, хранилище памяти должно принадлежать output operations
, о котором он упоминает. Но согласно Стандарту хранилище памяти не похоже на the output dynamics of interactive devices
. (Что вообще такое интерактивные устройства?)
Пример для подражания.
int A = 0;
int B = 0;
void foo()
{
A = B + 1; // (1)
B = 1; // (2)
}
Современный компилятор может сгенерировать следующий код для функции foo
:
mov 0x804a018, %eax
movl $0x1, 0x804a018 ; store 1 to B
add $0x1, %eax
mov %eax, 0x804a01c ; store 1 to A
ret
Как видно, магазин до A
переупорядочен с магазином до B
. Соответствует ли это правилу "как если бы"? Разрешается ли стандартом такое изменение порядка?