【发布时间】:2011-01-16 02:15:56
【问题描述】:
我在 C++ 中有一个简单的类,它有一个整数和一个 vtable:
class Something {
virtual void sampleVirtualMethod();
int someInteger;
};
如果您查看 MSVC 的对象布局(使用 /d1reportSingleClassLayout),您会得到:
class Something size(8):
+---
0 | {vfptr}
4 | someInteger
+---
这完全有道理。 4 个字节用于 vtable 指针,4 个字节用于整数。奇怪的是当我在类中添加一个 double 时:
class Something {
virtual void sampleVirtualMethod();
int someInteger;
**double someDouble;**
};
我得到了这个对象布局:
class Something size(24):
+---
0 | {vfptr}
8 | someInteger
| <alignment member> (size=4)
16 | someDouble
+---
为什么偏移量 0 和 someInteger 的区别是 8 而不是 4? vtable 是否以某种方式增长到 8 个字节?无论我添加双精度的顺序如何,都会发生这种情况。
谢谢。
【问题讨论】:
-
我不禁想知道你为什么会关心这个。这会对您的工作造成直接问题吗?
-
为什么不关心它? OP(和我)感到惊讶。尝试学习新事物有什么坏处? ;)
-
我正在尝试在二进制文件和 Visual Studio 二进制文件之间合并对象模型。这实际上是一个问题:)。奇怪的是,GCC 和 Visual Studio 都像这样布置对象,而 llvm 没有。
-
在现实生活中的程序中,如果对象被实例化了很多次,我会非常关心这个。浪费的内存影响将是毁灭性的。
-
这里的问题是
vfptr的size不可能改成8,还是4。但是由于int成员的偏移量改成了8,所以肯定有<alignment member>的它们之间的尺寸为 4。但是,报告中没有任何内容。这没有任何意义。看起来像一个错误。
标签: c++ layout object virtual compiler-construction