我一直在仔细研究标准草案,似乎找不到我要找的东西。
如果我有标准布局类型
struct T {
unsigned handle;
};
那我就知道reinterpret_cast<unsigned*>(&t) == &t.handle
代表了一些T t;
目标是创建一些vector<T> v
,并将&v[0]
传递给一个C函数,该函数需要一个指向无符号整数数组的指针。
那么,标准是否定义了sizeof(T) == sizeof(unsigned)
,这是否意味着T
数组将具有与unsigned
数组相同的布局?
虽然这个问题涉及一个非常相似的主题,但我询问的是数据成员和类都是标准布局的具体情况,而数据成员是基本类型。
我读过一些段落,似乎暗示这可能是真的,但没有什么能击中钉子的头。例如:
§9.2.17
如果两种标准布局结构(第9条)具有相同数量的非静态数据成员,而相应的非静态数据成员(按声明顺序)具有与布局兼容的类型,则它们是布局兼容的。
这不是我想要的,我不认为。
发布于 2014-02-02 02:57:27
你实际上是在问,考虑到:
struct T {
U handle;
};
是否保证了sizeof(T) == sizeof(U)
。不,它不是。
国际标准化组织C++03标准第9.2/17节规定:
指向使用
reinterpret_cast
适当转换的POD-struct对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。
假设您有一个struct T
数组。反之亦然,这意味着任何T::handle
成员的地址也必须是struct T
的有效地址。现在,假设这些成员是char
类型的,并且您的声明是正确的。这意味着struct T
将被允许有一个不对齐的地址,这似乎是不可能的。标准通常试图不以这种方式束缚实现的手。要使您的声明正确,标准必须要求允许struct T
具有未对齐的地址。而且必须允许所有的结构,因为struct T
可能是一个前向声明的不透明类型。
此外,9.2/17节还指出:
注:因此,在POD-struct对象中可能有未命名的填充,但不是在开始时,这是实现适当对齐所必需的。
换个角度看,这就意味着我们不能保证永远不会有垫子。
发布于 2014-02-02 02:25:11
我已经习惯了Borland的环境,对他们来说:
在您的情况下,t是一个结构,所以(T)是结构的大小。
出于同样的原因,如果你有4字节的结构(uint32)和16字节的联盟
https://stackoverflow.com/questions/21499120
复制相似问题