struct A {int a;};
struct B : A {int b;};
B b;
Run Code Online (Sandbox Code Playgroud)
标准是否保证字段在内存中的排序方式(即字段a排在前面)b并且是否有任何填充?
使用案例。我有class Specification和class Command。命令对象中包含规范以及一些附加信息。我希望在需要时能够使用任一类型的对象Specification。
这个用例非常幼稚 - 请务必阅读问题下面的所有评论。由于其他原因,最初的问题仍然很有趣:指针算术、缓冲区溢出、缓存模式和反编译浮现在脑海中。
你问:
\n\n\n\n\n标准是否保证字段在内存中的排序方式(即字段
\na排在前面)b并且是否有任何填充?
该标准不做出任何此类保证。它将这些细节留给了实施。来自 C++ 标准草案 (N3337):
\n\n\n\n\n10个派生类
\n\n5 基类子对象在最派生对象 (1.8) 中分配的顺序未指定。[注意:派生类及其基类子对象可以用有向无环图 (DAG) 表示,其中箭头表示直接派生自 \xe2\x80\x9c。\xe2\x80\x9d 子对象的 DAG 通常称为一个 \xe2\x80\x9c 子对象\n 晶格。\xe2\x80\x9d
\n
Base\n ^\n |\n Derived1\n ^\n |\n Derived2\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n6 箭头不需要在内存中有物理表示。\xe2\x80\x94尾注]
\n
虽然标准并不能保证这一点,但我还没有看到一个实现不符合您的预期。野外可能有一些,但我还没见过。
\n| 归档时间: |
|
| 查看次数: |
971 次 |
| 最近记录: |