关于C++对象的内存布局,网上有很多的文章可以参考,写的比较好的是陈浩的两篇:
C++ 对象的内存布局(上)点击打开链接
C++ 对象的内存布局(下)点击打开链接
这里只讨论c++里面类用sizeof取值的输出问题。
有这么一个面试题:下面这段代码的输出是什么?
#include<stdio.h>
class A
{
int a;
char b;
virtual void doing()=0;
};
int main()
{
printf("%d\n",sizeof(A));
return 0;
}
32位机器上,linux+gcc编译执行的结果是12。因为char要与int保持地址对齐,需要4字节,而虚函数表指针为4字节,
所以输出结果是4+4+4=12;
如果doing()函数有自身的实现,不是纯虚函数呢,输出也是12,只不过这时候虚函数表指针指向的虚函数表已经有了具体的函数入口地址,而不是NULL;
如果A的定义是这样的:
class A
{
int a;
char b;
void doing()=0;
};
这时候输出结果就是8了,我的理解是sizeof(A)相当于sizeof(a),而a是A类的一个对象,sizeof()操作只会计算成员变量和虚函数表指针所占用的内存空间。
普通方法(无论是否是static的),都不会计算在sizeof的结果内,类的static变量也不会计算在sizeof结果内。他们在内存里面都只有一份,存储在静态存储区。
读者可以试试下面的A类定义,运行下看看输出结果是什么。
#include<stdio.h>
class A
{
int a;
char b;
void doing(){
int a;
}
static double f;
static void func()
{
float fl;
}
};
int main()
{
printf("%d\n",sizeof(A));
return 0;
}
欢迎留言与讨论,有什么不对的地方请尽管指出。