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 个字节,因此在这种情况下无论如何都不需要修复“第一个”成员的对齐方式。
问候,谢尔姆