Что стандарт говорит о доступе к памяти без выравнивания?
Я искал через стандарт о неприсоединенном доступе, но ничего не нашел (возможно, я был непреднамеренным).
Это неопределенное поведение? Определена ли реализация?
Поскольку многие современные процессоры поддерживают не выровненный доступ, было бы разумно, чтобы доступ к не выровненной памяти определялся реализацией. Это так?
Например, я имею в виду доступ без выравнивания:
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++. Я не уверен, что любой компилятор делает это как бы то ни было.