对于类中有虚函数的时候,对象所占空间,字节对齐方式有变化么

最近的一个bug,让我发现对于类中的字节对齐还是有模糊地方,望大家指点
先上一段测试代码
class CPoint
{
private:
double x, y;
char a;
public:
CPoint(double i, double j)
{
x = i;
y = j;
}

virtual double area() const
{
    return 0;
}

};

在main 函数中这样调用:
CPoint point(1, 2);
cout << " point size is : " << sizeof(point) << endl;
在win10 64位 vs2012 下,我以为输出24,运行结果为 32,表示不解
把x 和 y的类型改为 int,其它都不变,我觉得输出为16,运行结果也为 16
请问,指向虚函数表的指针,在这个运行环境下,不应该是固定的4个字节么,为什么x,y为double类型时,对象的总长度会是32呢?

3个回答

要考虑字节对齐。double在64位下是8字节

字节对齐方式和不用虚函数相比没有变化
但是有虚函数,多出了虚表,那么内存位置有变化

我的想法是:为 double时 x占8个字节,y占8个字节,char a占1个字节,指向虚表的指针原本占4个字节
当发现前面已经占据了17个字节时,由于需要虚表指针存储位置会需要从4的整数倍开始
所以会在char a所占的位置之后补充3个空字节用来调整到4的整数倍,这样虚表指针从第21个字节开始存储,直到第24个字节
最后,对象中最长的变量所占字节是8,24刚好也是8的整数倍,所以不会再填充字节了
但实际运行的结果为 32 还请指点 谢谢各位

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问