Что стандарт говорит о доступе к памяти без выравнивания?

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

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

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

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

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

1 ответ

Решение

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

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

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

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

[...]

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

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

Другие вопросы по тегам