1. 如果实例化一个空类, 内存中只占用一个字节, 作为标识.
  2. 若类声明包含成员变量, 不包含成员函数, 会根据内存对齐原则, 将各个成员变量分布进内存
  3. 若类声明包含成员函数, 成员函数是不占用类的内存空间的, 所以类的内存空间仍然只包含成员变量的时候一样. 一个类的函数是公共的,一个类的函数只有一份。 那么函数存放在哪呢。这个不同的编译器,有不同的方式。有的存放在只读区,有的存放在代码区。
  4. 若类的声明包含虚函数, 前四个字节会分配一个虚函数表指针指向虚函数表.

4.1 追问: 若有多个子类, 每个子类实例化都有一张虚函数表吗?

是的. 虚函数表在编译时生成, 存放在全局数据区.
参考: https://www.cnblogs.com/chenhuan001/p/6485233.html

4.2 追问: 当存在继承关系的时候, 内存分布又是怎样的?
  • 父类和子类都有各自的内存空间。父类的内存空间就是它成员变量根据字节对齐占用的空间。
  • 而子类首先要继承父类的空间,其次自己定义的变量放在父类空间的下面,如果子类定义了和父类同名的变量,调用的时候该变量会覆盖掉父类的变量,但是该变量的位置仍然是在父类空间的下面。
    4.3 追问: 成员函数不占用内存空间, 那具体是怎样访问成员函数的?
    类中的成员函数存在于代码段。 调用成员函数时, 类对象的地址作为参数隐式传递给成员函数, 成员函数通过对象地址隐式访问成员变量。
    参考: 类成员函数调用分析
    4.4 追问: this指针存放在哪?
    当该非静态成员函数的参数个数一定时,它保存在CPU的EXC寄存器中,未定时(存在可变参数),保存在栈中。普通成员函数的函数地址在代码区。