sizeof(T)== sizeof(int)?

时间:2014-02-01 14:17:00

标签: c++ arrays sizeof

我一直在研究标准草案,似乎无法找到我正在寻找的东西。

如果我有标准布局类型

struct T {
   unsigned handle;
};

然后我知道某些reinterpret_cast<unsigned*>(&t) == &t.handle

T t;

目标是创建一些vector<T> v并将&v[0]传递给C函数,该函数需要指向无符号整数数组的指针。

那么,标准是否定义sizeof(T) == sizeof(unsigned)并且这是否意味着T数组与unsigned数组的布局相同?

虽然this question解决了一个非常相似的主题,但我要问的是数据成员和类都是标准布局的特定情况,而数据成员是基本类型。

我已经阅读了一些似乎暗示可能它可能是真实的段落,但没有任何东西可以击中头部。例如:

§9.2.17

  

两种标准布局结构(第9节)类型是布局兼容的   它们具有相同数量的非静态数据成员并且相应   非静态数据成员(按声明顺序)具有布局兼容性   类型

这不是我想要的,我不认为。

2 个答案:

答案 0 :(得分:5)

你基本上是在问:

struct T {
    U handle;
};

是否保证sizeof(T) == sizeof(U)。不,不是。

ISO C ++ 03标准的第9.2 / 17节说:

  

指向POD结构对象的指针,适当地使用a转换   reinterpret_cast,指向其初始成员(或者如果该成员是   比特字段,然后到它所在的单位,反之亦然。

假设您有一个struct T数组。反之亦然意味着任何T::handle成员的地址也必须是struct T的有效地址。现在,假设这些成员属于char类型并且您的声明属实。这意味着struct T将被允许具有未对齐的地址,这似乎不太可能。该标准通常试图不以这种方式绑定实现的手。为了使您的声明成立,标准必须要求允许struct T具有未对齐的地址。并且必须允许所有结构,因为struct T可以是前向声明的,不透明的类型。

此外,第9.2 / 17条继续陈述:

  

[注意:因此,在POD-struct对象中可能存在未命名的填充,但不是在其开头,以实现适当的对齐。]

采用不同的方式,意味着无法保证永远不会填充。

答案 1 :(得分:3)

我已经习惯了Borland环境和他们:

T是您的案例中的结构,因此sizeof(T)是struct

的大小
  • 取决于编译器的 #pragma pack align 设置
  • 所以有时它可能大于sizeof(unsigned)!!!

出于同样的原因,如果你有4Byte struct(uint32)和16Byte allign

  • struct T {uint32 u; };
  • 然后T a [100]与uint32 a [100];
  • 不同
  • 因为T是uint32 + 12 Byte空格!!!