首页 新闻 会员 周边 捐助

字节对齐问题

0
[已解决问题] 解决于 2013-06-05 11:13

class Base
{
public:
virtual void Print();
int d;
double b;
};
class A
{
public:
int a;
int b;
double c;
};
为什么用sizeof测内存大小时,Base实例占了24字节,而A实例占了16字节,不是应该都是16字节吗?
小弟是个新手,求大神解答?
我是在vc6.0下测的, 32位机子。

fun~的主页 fun~ | 菜鸟二级 | 园豆:204
提问于:2013-05-31 20:48
< >
分享
最佳答案
0

因为virtual,Base需要额外的4byte的空间来保存虚函数表指针

奖励园豆:5
Aaron.Pan | 菜鸟二级 |园豆:226 | 2013-06-02 05:08

嗯,这个我知道。但是4+4+8=16,16又是8的倍数,Base占的内存应该是16啊,应该跟A一样的啊

fun~ | 园豆:204 (菜鸟二级) | 2013-06-02 09:39

@fun~: 

你没看明白,是4+4+8+4,Base所需要额外存储的虚函数表指针4byte你没算进去,根据#pragma pack(8),所以得出24。

详细可以参考http://hi.baidu.com/skychongrichie/item/9e5f693e60ac324c80f1a725

Aaron.Pan | 园豆:226 (菜鸟二级) | 2013-06-02 12:14

@Aaron.Pan:

我不是算进去了吗?virtual指针占4字节+int d 4字节+ double b 8字节,不是16字节吗?

我可能看不明白,能跟我说详细些吗?谢谢了 

fun~ | 园豆:204 (菜鸟二级) | 2013-06-02 22:05

@fun~: 

virtual void Print();-------- 4

int d;------------------------4
double b;-------------------8

但因为Base类中Print方法是虚函数,所以还需要一个虚函数表指针来指向虚函数表------------4

这样就是 4+4+8+4 然后根据#pragma pack(8),得出24

Aaron.Pan | 园豆:226 (菜鸟二级) | 2013-06-02 22:57

@Aaron.Pan: 

virtual void Print();占4个字节与虚函数表指针不是同一个概念,详细的内容http://hi.baidu.com/skychongrichie/item/9e5f693e60ac324c80f1a725讲得很清楚。

Aaron.Pan | 园豆:226 (菜鸟二级) | 2013-06-02 23:01

@Aaron.Pan: 

哦, 可是我又做了个测试,结果跟你讲的不一样啊

class A

public:

virtual void Print();

}

class B

public:

virtual void Print();

int m_a;

}

在vc上测了下,A占了4字节,B占了8字节,按照你的思路,A应该是8,B应该是12,这是为什么?

我已经蒙了,感觉虚函数真蛋疼啊

fun~ | 园豆:204 (菜鸟二级) | 2013-06-03 10:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册