【问题标题】:What does the standard say about the order of member variable declarations? [duplicate]标准对成员变量声明的顺序有何规定? [复制]
【发布时间】:2018-12-07 13:50:18
【问题描述】:

在 C++ 中,如果我这样声明一个类/结构:

struct Data
{
    int member0;
    int member1;
};

在大多数编译器中,member0 在对象表示中的出现早于member1

标准是否规定了这种行为,或者理论上允许编译器在对象表示中将member1 放在member0 之前?
标准对此有什么说法,在哪里说的?
(如果强制行为在任何时候发生了变化,我对所有标准版本都感兴趣。)

【问题讨论】:

  • 你的意思是结构实例的内存布局吗?
  • 您想确切了解这个特定的结构,还是在寻找更一般的答案?这个具体的例子很简单,一般的答案几乎可以是它自己的书。
  • “分配具有相同访问控制的(非联合)类的非静态数据成员,以便以后的成员在类对象中具有更高的地址” 所以是的,@ 987654326@ 必须早于member1
  • @CoryKramer 这不是那个问题的重复,那个问题是关于dynamic_castreinterpret_cast

标签: c++ object memory language-lawyer standards


【解决方案1】:

来自[class.mem§19]

分配具有相同访问控制的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址。 未指定具有不同访问控制的非静态数据成员的分配顺序。 实现对齐要求可能会导致两个相邻的成员不能立即分配;管理虚拟功能和虚拟基类的空间需求也是如此。

由于您的两个成员都是public,因此member0 保证在member1 之前存储。

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 2011-04-04
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多