我有这段代码:
#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位。
发布于 2013-04-01 19:14:38
除了char或unsigned char之外,您不能假设任何其他东西的大小。如果您在64位平台上构建,int可能仍然是4个字节,但虚拟表指针的大小可能是8,额外的4个字节用于填充(因此指针对齐到8个字节)。
64位
+----+----+----+----+
| vp | vp | x_ | p |
+----+----+----+----+
vp - virtual table pointer
x_ - member
p - padding byte32位
+----+----+
| 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。
发布于 2013-04-01 19:16:19
我最好的猜测是,您正在为具有64位指针的平台进行编译。然后,虚拟指针需要8个字节,int可能需要4个字节(一些64位平台也会提供8个字节-但是您说sizeof (PlainOldClass)是4,所以这里不适用),另外需要4个字节来给类提供指针所需的64位对齐-总共16个字节。
发布于 2013-04-01 19:18:37
我认为代价是:
所需的64位对齐方式
sum=16字节。
https://stackoverflow.com/questions/15742337
复制相似问题