sizeof(T)== sizeof(const T)和alignof(T)== alignof(const T)

假设Tconst T是两个相同大小和相同排列的types似乎是合理的,但是在考虑了一些真实的系统之后,似乎可能会有所不同。

让我解释:

假设你有一个有两种types的内存的系统:RAM和Flash(它是只读的)。 RAM是8位寻址,而闪存只能寻址16位。 假设这是T

 struct T { uint8_t x; uint16_t y; }; 

在字节可寻址的RAM中,这个结构的长度是3个字节,但是在双字节可寻址的Flash中(这是一个constvariables所在的地方),因为alignment问题,这个结构必须至less有4个字节长。

所以这是我的问题:

c和c ++标准是否保证const和非consttypes的大小和alignment?

第3.9.3节:

一个types的cv-qualified或cv-unqualified版本是不同的types; 但是,它们应具有相同的表示和alignment要求(3.11)。 53

“cv-qualified”在这里是指constvolatile 。 所以答案是肯定的

constvolatile只能指定对指定对象访问的限制/属性。 它们不被认为是基本types本身的一部分; 因此它们不能影响types的属性。

是的,这是由[basic.type.qualifier] / 1保证的

一个types的cv-qualified或cv-unqualified版本是不同的types; 但是, 它们应具有相同的表示和alignment要求 (3.11)。

在字节可寻址的RAM中,这个结构的长度是3个字节,但是在双字节可寻址的Flash中(这是一个constvariables所在的地方),因为alignment问题,这个结构必须至less有4个字节长。

然而,编译器不能推断,因为它是const在这里,它存储在ROM中。 还有很多其他的东西可以阻止这种情况的发生,比如mutable ,或者你可以dynamic地将const T放在堆栈上,或者手动将它放入RAM或者其他一些内存中的堆内存中。 你也可以有一个const T&可以在任何位置。