我有这段代码:
#include <stdio.h>
class CoolClass {
public:
virtual void set(int x){x_ = x;};
virtual int get(){return x_;};
private:
int x_;
};
class PlainOldClass {
public:
void set(int x) {x_ = x;};
int get(){return x_;}
private:
int x_;
};
int main(void) {
printf("CoolClass size: %ld\n", sizeof(CoolClass));
printf("PlainOldClass size: %ld\n", sizeof(PlainOldClass));
return 0;
}
我有点困惑,因为它说 CoolClass 的大小是 16?如何?为什么?即使有指向 vtable 的指针,大小不应该是 8 吗? oldclass 的大小如预期的那样是 4。
编辑:我正在使用 g++ 4.6.3 运行 Linux Mint 64 位。
最佳答案
除了 char
或 unsigned char
之外,您不能假设任何其他内容的大小。如果您在 64 位平台上构建,int
可能仍然是 4 个字节,但虚拟表指针的大小可能是 8
,额外的 4 个字节用于填充(以便指针对齐到 8 个字节)。
64 位
+----+----+----+----+
| vp | vp | x_ | p |
+----+----+----+----+
vp - virtual table pointer
x_ - member
p - padding byte
32 位
+----+----+
| vp | x_ |
+----+----+
vp - virtual table pointer
x_ - member
p - padding byte
Padding not required because the pointer is already aligned
作为测试,你可以试试
class PlainOldClass {
private:
int* x_;
};
它的大小为 8。
关于C++ 多态内存成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15742337/