1.先来个最简单的
这里
占用1字节作为占位。一个char 填充。当然还有空字节的。为0。
这里要说明 构造函数、析构函数和一般函数都放在代码区sizeof是不计算其占用内存的。
2.虚函数、char和static
占用4+4+4+8+4 = 24B
这里说明virtual是有指针存放在对象中的占4B。
3.虚继承
class C : public virtual A
{
//只是举个例子
}
这里sizeof(C) 如果是在占位1字节的编译器。则 = 8。
虚继承会产生一个虚表指针。加1字节的char 填充。还有alignment对齐字节数为4的倍数(32位)
PS:虚继承只保留一份重复的实体。这里重复的实体是填充的1Byte。(当然这里没有重复,只是做个笔记)
static变量是不在对向占用内存的。static占用全局变量区内存。static在 data segment。
(这里有人说static是在代码区,这里应该是不对的。有兴趣可以自己试一试看看)
这里截一个linux系统的内存结构图
static应该存放在data段。text段为代码区。实例化的对象存放在堆栈(new 的在堆)。
也就是说class中用sizeof计算内存应该计算的是:
virtual函数、成员变量。还有就是字节对齐。