c++ - ¿Sizeof(T)== sizeof(const T) y alignof(T)== alignof(const T)
alignment (3)
Parece razonable suponer que T
y const T
serían dos tipos que tendrían el mismo tamaño y la misma alineación, pero después de pensar en algunos sistemas reales, parece que podrían ser diferentes.
Dejame explicar:
Supongamos que tiene un sistema con dos tipos de memoria: RAM y Flash (que es de solo lectura). La memoria RAM es de 8 bits direccionables, mientras que la memoria flash es de solo 16 bits direccionables. Supongamos que esto es T
:
struct T
{
uint8_t x;
uint16_t y;
};
En el byte direccionable RAM esta estructura tendría 3 bytes de longitud ... pero en el Flash direccionable de doble byte (que es donde residiría una variable const
) esta estructura tendría que tener al menos 4 bytes de longitud, debido a problemas de alineación.
Ésta es mi pregunta:
¿Los estándares c y c ++ garantizan los tamaños y la alineación de los tipos const
y non const
?
En el byte direccionable RAM esta estructura tendría 3 bytes de longitud ... pero en el Flash direccionable de doble byte (que es donde residiría una variable const) esta estructura tendría que tener al menos 4 bytes de longitud, debido a problemas de alineación.
Sin embargo, el compilador no puede inferir que solo porque está aquí, se almacena en la ROM. Hay muchas otras cosas que pueden evitar eso, como mutable
, o simplemente puedes colocar dinámicamente la const T
en la pila o colocarla manualmente en la memoria del montón en la RAM u otras mil cosas más. También podrías tener una const T&
que podría estar en cualquier ubicación.
Sí, esto está garantizado por [basic.type.qualifier] / 1
Las versiones cv-calificadas o cv-no calificadas de un tipo son tipos distintos; sin embargo, tendrán los mismos requisitos de representación y alineamiento (3.11).
Sección 3.9.3:
Las versiones cv-calificadas o cv-no calificadas de un tipo son tipos distintos; sin embargo, tendrán los mismos requisitos de representación y alineamiento (3.11). 53
"cv-qualified" aquí se refiere a const
y volatile
. Entonces la respuesta es sí.
const
y volatile
solo especifican las limitaciones / atributos de acceso al objeto especificado. No se consideran parte del tipo de base en sí mismo; por lo tanto, no pueden afectar las propiedades del tipo.