似乎可以合理地假设T
和const T
将是两种类型相同且具有相同对齐的类型,但在考虑了一些真实系统之后,似乎它们可能是不同。
让我解释一下:
假设您的系统有两种类型的内存:RAM和Flash(只读)。 RAM是8位可寻址的,而闪存只有16位可寻址。假设这是T
:
struct T
{
uint8_t x;
uint16_t y;
};
在字节可寻址RAM中,这个结构长度为3个字节....但是在双字节可寻址Flash(这是const
变量所在的位置)这个结构必须至少为4个字节很长一段时间,因为对齐问题。
所以这是我的问题:
c和c ++标准是否保证const
和非const
类型的大小和对齐?
答案 0 :(得分:33)
第3.9.3节:
类型的cv-qualified或cv-nonqualified版本是不同的 类型;但是,它们应具有相同的表示和对齐方式 要求(3.11)。 53
" CV-合格"这里指的是const
和volatile
。答案是肯定的。
const
和volatile
仅指定访问指定对象的限制/属性。它们不被认为是基本类型本身的一部分;因此它们不会影响类型的属性。
答案 1 :(得分:31)
是的,这由[basic.type.qualifier] / 1
保证类型的cv限定或cv非限定版本是不同类型;但是,它们应具有相同的表示和对齐要求(3.11)。
答案 2 :(得分:3)
在字节可寻址RAM中,这个结构长3个字节....但是 在双字节可寻址Flash中(这是一个const变量 将驻留)此结构必须至少4个字节长, 因为对齐问题。
但是,编译器不能推断它只是因为它是const
,它存储在ROM中。还有很多其他的东西可以阻止它,比如mutable
,或者你可以动态地将const T
放在堆栈上,或者手动将它放入RAM的堆内存或其他一些东西中。您也可以在任意位置使用const T&
。