sizeof(T)== sizeof(const T)和alignof(T)== alignof(const T)
假设T
和const T
是两个相同大小和相同排列的types似乎是合理的,但是在考虑了一些真实的系统之后,似乎可能会有所不同。
让我解释:
假设你有一个有两种types的内存的系统:RAM和Flash(它是只读的)。 RAM是8位寻址,而闪存只能寻址16位。 假设这是T
:
struct T { uint8_t x; uint16_t y; };
在字节可寻址的RAM中,这个结构的长度是3个字节,但是在双字节可寻址的Flash中(这是一个const
variables所在的地方),因为alignment问题,这个结构必须至less有4个字节长。
所以这是我的问题:
c和c ++标准是否保证const
和非const
types的大小和alignment?
第3.9.3节:
一个types的cv-qualified或cv-unqualified版本是不同的types; 但是,它们应具有相同的表示和alignment要求(3.11)。 53
“cv-qualified”在这里是指const
和volatile
。 所以答案是肯定的
const
和volatile
只能指定对指定对象访问的限制/属性。 它们不被认为是基本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&
可以在任何位置。