继承类中字段的顺序是什么?

Vor*_*rac 5 memory c++11

struct A {int a;};
struct B : A {int b;};
B b;
Run Code Online (Sandbox Code Playgroud)

标准是否保证字段在内存中的排序方式(即字段a排在前面)b并且是否有任何填充?


使用案例。我有class Specificationclass Command。命令对象中包含规范以及一些附加信息。我希望在需要时能够使用任一类型的对象Specification

这个用例非常幼稚 - 请务必阅读问题下面的所有评论。由于其他原因,最初的问题仍然很有趣:指针算术、缓冲区溢出、缓存模式和反编译浮现在脑海中。

R S*_*ahu 5

你问:

\n\n
\n

标准是否保证字段在内存中的排序方式(即字段a排在前面)b并且是否有任何填充?

\n
\n\n

该标准不做出任何此类保证。它将这些细节留给了实施。来自 C++ 标准草案 (N3337):

\n\n
\n

10个派生类

\n\n

5 基类子对象在最派生对象 (1.8) 中分配的顺序未指定。[注意:派生类及其基类子对象可以用有向无环图 (DAG) 表示,其中箭头表示直接派生自 \xe2\x80\x9c。\xe2\x80\x9d 子对象的 DAG 通常称为一个 \xe2\x80\x9c 子对象\n 晶格。\xe2\x80\x9d

\n
\n\n
            Base\n             ^\n             |\n          Derived1\n             ^\n             |\n          Derived2\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

6 箭头不需要在内存中有物理表示。\xe2\x80\x94尾注]

\n
\n\n

虽然标准并不能保证这一点,但我还没有看到一个实现不符合您的预期。野外可能有一些,但我还没见过。

\n