- 如果实例化一个空类, 内存中只占用一个字节, 作为标识.
- 若类声明包含成员变量, 不包含成员函数, 会根据内存对齐原则, 将各个成员变量分布进内存
- 若类声明包含成员函数, 成员函数是不占用类的内存空间的, 所以类的内存空间仍然只包含成员变量的时候一样. 一个类的函数是公共的,一个类的函数只有一份。 那么函数存放在哪呢。这个不同的编译器,有不同的方式。有的存放在只读区,有的存放在代码区。
- 若类的声明包含虚函数, 前四个字节会分配一个虚函数表指针指向虚函数表.
4.1 追问: 若有多个子类, 每个子类实例化都有一张虚函数表吗?
是的. 虚函数表在编译时生成, 存放在全局数据区.
参考: https://www.cnblogs.com/chenhuan001/p/6485233.html
4.2 追问: 当存在继承关系的时候, 内存分布又是怎样的?
- 父类和子类都有各自的内存空间。父类的内存空间就是它成员变量根据字节对齐占用的空间。
- 而子类首先要继承父类的空间,其次自己定义的变量放在父类空间的下面,如果子类定义了和父类同名的变量,调用的时候该变量会覆盖掉父类的变量,但是该变量的位置仍然是在父类空间的下面。
4.3 追问: 成员函数不占用内存空间, 那具体是怎样访问成员函数的?
类中的成员函数存在于代码段。 调用成员函数时, 类对象的地址作为参数隐式传递给成员函数, 成员函数通过对象地址隐式访问成员变量。
参考: 类成员函数调用分析4.4 追问: this指针存放在哪?
当该非静态成员函数的参数个数一定时,它保存在CPU的EXC寄存器中,未定时(存在可变参数),保存在栈中。普通成员函数的函数地址在代码区。
