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

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

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

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

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

Безлицензионным доступом я имею в виду, например:

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

Ответ 1

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

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

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

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

[...]

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

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