栈区:由编译器创建和回收,存放局部变量和函数参数,创建是由高地址到低地址,后进先出。
堆区:由程序员管理,需要手动创建(new/malloc)和释放(delete []),若没有释放会造成内存泄漏,频繁的创建和释放会出现空闲碎片的情况,创建是由小到大。
全局/静态存储区:分为初始化和未初始化的两个相邻区,存储全局变量或静态变量。
常量存储区:存储常量(由const或#define定义的)。
代码区:存放程序的二进制代码。
函数调用过程:压栈出栈,栈帧。
- 普通函数调用流程:开辟栈空间、函数参数从右向左进行压栈、函数返回地址进行压栈、局部变量进行压栈;
- 普通成员函数调用流程:该函数在编译期已经确定,直接找到该函数地址;this指针,作为隐含参数传入该函数,之后的调用和普通函数一样;
- 虚函数调用流程:查找this指针的地址,根据this指针,查找虚函数表的地址,从虚函数表中,取出相应的函数地址。