c ++ 11 — Допускается ли переупорядочение магазина правилом C ++ как-будто?

«как будто«правило в основном определяет, какие преобразования разрешено выполнять реализации в легальной программе на C ++. Короче говоря, все преобразования, которые не влияют на наблюдаемое поведение разрешены.

Что именно «наблюдаемое поведение» обозначает, cppreference.com Похоже, что есть другое определение с определением, данным стандартом, относительно ввода / вывода. Я не уверен, является ли это переосмыслением Стандарта или ошибкой.

«как будто«Правило cppreference.com:

  • Все операции ввода и вывода выполняются в том же порядке и с
    такое же содержание, как если бы программа была выполнена как написано.

«как будтоПравило по Стандарту:

  • Должна иметь место динамика ввода и вывода интерактивных устройств
    таким образом, что побуждающий вывод на самом деле доставляется до
    Программа ожидает ввода. Что представляет собой интерактивное устройство
    от реализации

Это различие важно для меня, потому что я хочу знать, является ли нормальное переупорядочение магазина действительной оптимизацией компилятора или нет. Согласно формулировке, хранилище памяти должно принадлежать 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, Это соответствует «как будто«Правило? Допускается ли такое изменение порядка в Стандарте?

2

Решение

Если cppreference.com не согласен с фактическим текстом стандарта C ++, cppreference.com неверен. Единственное, что может заменить текст стандарта, это более новая версия стандарта, и официальные решения отчетов о дефектах (которые иногда сворачиваются в документы, называемые «техническая корригенда», что является причудливым названием для незначительного выпуска стандарта).

Однако в этом случае вы неправильно поняли, что означает cppreference.com под «операциями ввода и вывода». (Если память служит, этот текст дословно взят из более старой версии стандарта.) Сохранения в памяти НЕ выходные операции. Пишу только файл (то есть любой stdio.h или же iostream выходной поток или другой определенный реализацией механизм, например, файловый дескриптор Unix) считается как выход для целей этого правила.

Стандарты C и C ++ до их редакций 2011 года предполагали однопоточных абстрактная машина, и, следовательно, не удосужился указать что-либо о порядке расположения магазинов, потому что не было возможности наблюдать за магазинами вне программного порядка. C (++) 11 добавил целый набор правил для упорядочения хранилищ как часть новой спецификации многопоточности.

3

Другие решения

Реальная формулировка правила «как будто» найдена в §1.9 / 8 в стандарте:

  • Доступ к изменчивым объектам оценивается строго по правилам абстрактной машины.
  • По завершении программы все данные, записанные в файлы, должны быть идентичны одному из возможных результатов, которые
    Выполнение программы в соответствии с абстрактной семантикой было бы произведено.
  • Динамика ввода и вывода интерактивных устройств должна происходить таким образом, чтобы
    вывод на самом деле доставляется до того, как программа ожидает ввода. Что представляет собой интерактивное устройство
    определяется реализацией.

поскольку A а также B не изменчивы, это изменение порядка допускается.

2