我有这段代码:
#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的大小?老班的大小是预期的4。
编辑:我用g ++ 4.6.3运行Linux Mint 64位。
答案 0 :(得分:5)
除了char
或unsigned char
之外,您不能假设任何其他内容的大小。如果你在64位平台上构建,int
可能仍然是4个字节,但虚拟表指针的大小可能是8
,额外的4个字节用于填充(所以指针对齐到8个字节。)
+----+----+----+----+
| vp | vp | x_ | p |
+----+----+----+----+
vp - virtual table pointer
x_ - member
p - padding byte
+----+----+
| 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。
答案 1 :(得分:4)
我最好的猜测是你正在编译一个64位指针的平台。那么你需要8个字节用于虚拟指针,可能需要4个字节用于int
(一些64位平台也会提供8个字节 - 但你说sizeof (PlainOldClass)
是4,所以这样做“这里适用”,另外4个给类提供指针所需的64位对齐 - 总共16个字节。
答案 2 :(得分:2)
我认为费用是:
- 平台有64位指针,所以8个字节用于虚拟指针
- int的4个字节(但在某些平台上也可能是8个字节)
- 4为类提供指针所需的64位对齐
sum = 16个字节。
答案 3 :(得分:1)
这是因为你的系统可能是64位系统,因此它会成为,
因此总和变为16。