Стандарт C ++ предписывает, являются ли эти два метода доступа к массиву одинаковыми или разными? - PullRequest
0 голосов
/ 26 ноября 2010

С учетом следующего массива и двух серий назначений:

char charArray[3];

charArray[0]='a';
charArray[1]='b';
charArray[2]='c';

char & charRef1=charArray[0];
charRef1='a';
char & charRef2=charArray[1];
charRef2='b';
char & charRef3=charArray[2];
charRef3='c';

Указывает ли стандарт C ++, должны ли эти две серии назначений выполняться компилятором одинаково или по-разному?

Ответы [ 2 ]

4 голосов
/ 26 ноября 2010

Нет, стандарт не предъявляет требований к тому, чтобы детали реализации были одинаковыми.1.9 / 1:

Семантические описания в этом международном стандарте определяют параметризованную недетерминированную абстрактную машину.Настоящий международный стандарт не предъявляет требований к структуре соответствующих реализаций.В частности, им не нужно копировать или эмулировать структуру абстрактной машины.Скорее, соответствующие реализации требуются для эмуляции (только) наблюдаемого поведения абстрактной машины, как описано ниже.

Таким образом, только «наблюдаемое поведение» должно быть таким же.Наблюдаемое поведение определено в 1.9 / 6:

Наблюдаемое поведение абстрактной машины - это последовательность операций чтения и записи в изменчивые данные и обращения к функциям ввода-вывода библиотеки.

Точные инструкции, используемые для достижения этой цели, не являются "наблюдаемым поведением", и в вашем примере, поскольку массив не volatile, порядок записи также не наблюдается.На самом деле, если вы не используете массив позже, сами записи не наблюдаются.Для оптимизатора реализации было бы законно успешно удалить весь фрагмент кода в одном случае, но не в другом, хотя, возможно, удивительно, что он может управлять только одним.

0 голосов
/ 26 ноября 2010

Стандарт не гарантирует никакой реализации, только «наблюдаемое поведение».Таким образом, это может привести к случайному выбору между различными реализациями для каждого, в том числе вообще не делать назначения.Каждый из них может быть скомпилирован по-разному каждый раз, когда он встречается.

Целью этого является оптимизация для платформы и контекста.

(например, если компилятор помещает байт pad послеОбъявление char [3] может инициализироваться путем присвоения одного 32-битного значения. Порядок этого назначения может быть изменен и т. д.)

...