c++ - revista - ¿Qué dice la norma sobre el acceso a la memoria no alineada?
lecturas revista ethos gubernamental (1)
No, es UB. No puede iniciar la vida útil de un objeto en la memoria no alineada. Desde [basic.life]p1
La vida útil de un objeto de tipo T comienza cuando:
se obtiene un almacenamiento con la alineación y tamaño adecuados para el tipo T , y
si el objeto tiene una inicialización no vacía, su inicialización es completa,
[...]
Por lo tanto, en su ejemplo, la vida útil del objeto al que hace referencia x
ni siquiera comienza, por lo que cualquier otro uso que no se mencione en [basic.life]p6 es UB.
Pero lo que se le permite hacer a su implementación es decir que la memoria no alineada (según lo especificado por la arquitectura subyacente utilizada) realmente está alineada, por lo que su código es válido en la máquina abstracta de C ++. No estoy seguro de si algún compilador hace esto sin embargo.
Busqué a través del estándar sobre acceso no alineado, pero no encontré nada (tal vez fui inadvertido).
¿Es un comportamiento indefinido? ¿Se define la implementación?
Como muchas CPU actuales admiten el acceso no alineado, sería sensato que el acceso a la memoria no alineada esté definido por la implementación. ¿Es el caso?
Por acceso no alineado, quiero decir, por ejemplo:
alignas(int) char buffer[sizeof(int)+1];
int &x = *new(buffer+1) int;
x = 42;