MSVC对象布局Quirk

Mas*_*son 6 c++ compiler-construction virtual layout object

我在C++中有一个简单的类,它有一个整数和一个vtable:

class Something {

   virtual void sampleVirtualMethod();

   int someInteger;
};
Run Code Online (Sandbox Code Playgroud)

如果你查看MSVC的对象布局(使用/ d1reportSingleClassLayout),你会得到:

class Something       size(8):
        +---
 0      | {vfptr}
 4      | someInteger
        +---
Run Code Online (Sandbox Code Playgroud)

这完全有道理.vtable指针为4个字节,整数为4个字节.奇怪的是当我在类中添加一个double:

class Something {    
    virtual void sampleVirtualMethod();
    int someInteger;
    **double someDouble;**
};
Run Code Online (Sandbox Code Playgroud)

我得到这个对象布局:

class Something       size(24):
        +---
 0      | {vfptr}
 8      | someInteger
        | <alignment member> (size=4)
16      | someDouble
        +---
Run Code Online (Sandbox Code Playgroud)

为什么0 offset和someInteger 8之间的差异而不是4?vtable是否以某种方式增长到8个字节?无论我添加双精度的顺序如何,都会发生这种情况.

谢谢.

小智 0

我无法直接回答你的问题,因为编译器的行为没有很好的借口。相反,我会沉迷于疯狂的猜测,因为还没有答案。

我怀疑对齐算法中有一个错误,如下所示:

  • 结构的对齐方式(即第一个成员的放置)应至少与其最宽成员的对齐方式一样宽
  • 糟糕,忘记将虚函数表指针计为成员

如果这个 bug 存在,我怀疑它是编译器早期作为 4 字节对齐 C 编译器遗留下来的。现在编译器的默认值/Zp8意味着每个结构都至少对齐到 8 个字节,因此在这种情况下无论如何都不需要修复“第一个”成员的对齐方式。

问候,谢尔姆