c++ c alignment sizeof

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.