首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >==的大小(Int)是多少?

==的大小(Int)是多少?
EN

Stack Overflow用户
提问于 2014-02-01 06:16:59
回答 2查看 782关注 0票数 13

我一直在仔细研究标准草案,似乎找不到我要找的东西。

如果我有标准布局类型

代码语言:javascript
运行
AI代码解释
复制
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条)具有相同数量的非静态数据成员,而相应的非静态数据成员(按声明顺序)具有与布局兼容的类型,则它们是布局兼容的。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-02 02:57:27

你实际上是在问,考虑到:

代码语言:javascript
运行
AI代码解释
复制
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对象中可能有未命名的填充,但不是在开始时,这是实现适当对齐所必需的。

换个角度看,这就意味着我们不能保证永远不会有垫子。

票数 6
EN

Stack Overflow用户

发布于 2014-02-02 02:25:11

我已经习惯了Borland的环境,对他们来说:

在您的情况下,t是一个结构,所以(T)是结构的大小。

  • 这取决于编译器的#杂注包对齐设置。
  • 因此,有时它可以大于大小(未签署)!

出于同样的原因,如果你有4字节的结构(uint32)和16字节的联盟

  • 结构T{ uint32 u;};
  • T a100与uint32 a100不一致;
  • 因为T是uint32 + 12字节空空间!
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21499120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档