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

时间:2016-08-06 02:04:20

标签: c++ c alignment sizeof

似乎可以合理地假设Tconst T将是两种类型相同且具有相同对齐的类型,但在考虑了一些真实系统之后,似乎它们可能是不同。

让我解释一下:

假设您的系统有两种类型的内存:RAM和Flash(只读)。 RAM是8位可寻址的,而闪存只有16位可寻址。假设这是T

struct T
{
  uint8_t x;
  uint16_t y;
};

在字节可寻址RAM中,这个结构长度为3个字节....但是在双字节可寻址Flash(这是const变量所在的位置)这个结构必须至少为4个字节很长一段时间,因为对齐问题。

所以这是我的问题:

c和c ++标准是否保证const和非const类型的大小和对齐?

3 个答案:

答案 0 :(得分:33)

第3.9.3节:

  

类型的cv-qualified或cv-nonqualified版本是不同的   类型;但是,它们应具有相同的表示和对齐方式   要求(3.11)。 53

" CV-合格"这里指的是constvolatile。答案是肯定的。

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

答案 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&