Что стандарт говорит о доступе к памяти без выравнивания? - PullRequest
0 голосов
/ 01 июля 2018

Я искал стандарт о неприсоединенном доступе, но ничего не нашел (возможно, я был непреднамеренным).

Это неопределенное поведение? Определена ли реализация?

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

Под ненастроенным доступом я имею в виду, например:

alignas(int) char buffer[sizeof(int)+1];
int &x = *new(buffer+1) int;
x = 42;

1 Ответ

0 голосов
/ 01 июля 2018

Нет, это UB. Вы не можете начать время жизни объекта в невыровненной памяти. От [basic.life] p1

Время жизни объекта типа T начинается, когда:

  • хранилище с правильным выравниванием и размером для типа T получается, и

  • если объект имеет не пустую инициализацию, его инициализация завершена,

[...]

Итак, в вашем примере время жизни объекта, на который ссылается x, даже не начинается, поэтому любое другое его использование, кроме упомянутого в [basic.life] p6 , равно UB.

Но что ваша реализация может делать, так это сказать, что невыровненная память (как указано в используемой базовой архитектуре) фактически выровнена, что делает ваш код допустимым в абстрактной машине C ++. Однако я не уверен, что это делает какой-либо компилятор.

...