sizeof(T)== sizeof(int)?

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节)类型是布局兼容的,如果它们具有相同数量的非静态数据成员,并且相应的非静态数据成员(按声明顺序)具有布局兼容类型

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

jam*_*lin 5

你基本上是在问:

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对象中可能存在未命名的填充,但不是在其开头,以实现适当的对齐.]

采用不同的方式,意味着不能保证永远不会填充.