我一直在研究标准草案,似乎无法找到我正在寻找的东西。
如果我有标准布局类型
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节)类型是布局兼容的 它们具有相同数量的非静态数据成员并且相应 非静态数据成员(按声明顺序)具有布局兼容性 类型
这不是我想要的,我不认为。
答案 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
的大小出于同样的原因,如果你有4Byte struct(uint32)和16Byte allign