Ant*_*ony 12 c++ arrays sizeof
我一直在研究草案标准,似乎无法找到我正在寻找的东西.
如果我有标准布局类型
struct T {
unsigned handle;
};
Run Code Online (Sandbox Code Playgroud)
然后我知道reinterpret_cast<unsigned*>(&t) == &t.handle
对某些人T t;
目标是创建一些vector<T> v
并传递&v[0]
给一个C函数,该函数需要一个指向无符号整数数组的指针.
那么,标准是否定义sizeof(T) == sizeof(unsigned)
并且这是否意味着数组T
将具有与数组相同的布局unsigned
?
虽然这个问题涉及一个非常相似的主题,但我要问的是数据成员和类都是标准布局的特定情况,而数据成员是基本类型.
我读过一些段落,似乎暗示,也许它可能是真的,但没有什么击中了要害.例如:
§9.2.17
两个标准布局结构(第9节)类型是布局兼容的,如果它们具有相同数量的非静态数据成员,并且相应的非静态数据成员(按声明顺序)具有布局兼容类型
这不是我想要的,我不认为.
你基本上是在问:
struct T {
U handle;
};
Run Code Online (Sandbox Code Playgroud)
是否保证sizeof(T) == sizeof(U)
.不它不是.
ISO C++ 03标准的第9.2/17节说:
指向POD结构对象的指针(适当地使用a转换)
reinterpret_cast
指向其初始成员(或者如果该成员是位字段,则指向它所驻留的单元),反之亦然.
假设你有一个数组struct T
.反之亦然意味着任何T::handle
成员的地址也必须是a的有效地址struct T
.现在,假设这些成员属于类型char
并且您的主张是正确的.这意味着struct T
允许有一个未对齐的地址,这似乎不太可能.该标准通常试图不以这种方式绑定实现的手.为了使您的声明成立,标准必须要求struct T
允许具有未对齐的地址.并且它必须被允许用于所有结构,因为struct T
它可以是前向声明的,不透明的类型.
此外,第9.2/17条继续指出:
[注意:因此,在POD-struct对象中可能存在未命名的填充,但不是在其开头,以实现适当的对齐.]
采用不同的方式,意味着不能保证永远不会填充.