【C++】C++面向对象模型初探
1.成员的分开存储
C++通过将类的成员分开存储的方式来实现面向对象
成员 | 存储位置 |
---|---|
普通成员变量 | 栈区,与struct变量有相同的内存布局和字节对齐方式 |
静态成员变量 | 全局数据区,如此便可以使用类名和类所有的对象都可以访问 |
成员函数 | 代码段,包括静态成员函数和非静态成员函数 |
虚函数 | 虚函数表指针(vfptr)存放在栈区,其指向的虚函数表有自身的内存存储空间 |
2.C++类的内存分布
要想更好的了解这些,我们还需了解C++类的内存分布
Stack:
栈,存放Automatic Variables,按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。保存程序中的局部变量。
Heap:
堆,自由申请的空间,按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。 动态分配的内存在调用malloc()或者相关函数产生,在调用free()时释放,由程序员决定而不是一系列规则规定内存持续时间,因此内存块可在一个函数中创建,在另一个函数中释放。由于这点,动态内存分配容易导致堆区内存碎片化。
.Data:
存放程序中 已经初始化的非零全局变量。静态分配。
data又可分为读写(RW)区域和只读(RO)区域。
- RO段保存常量所以也被称为
.constdata
eg const数据 - RW段则是普通非常全局变量,静态变量就在其中
.Bss:
存放程序中未初始化的和零值全局变量。静态分配,在程序开始时通常会被清零。
.Text:
也称为代码段(Code),用来存放程序执行代码,同时也可能会包含一些常量(如一些字符串常量等)。该段内存为静态分配,只读(某些架构可能允许修改)。
这块内存是共享的,当有多个相同进程(Process)存在时,共用同一个text段。
普通成员变量存储在栈区,使得每一个类的对象都拥有各自独立的普通成员变量。
静态成员变量存储在全局数据区,是的每一个类的对象都共享一份静态
成员变量。
3.this指针
那么,存放在代码段的成员函数是怎么区分调用对象的呢?
事实上, C++为每一个函数都隐式定义了一个函数所属类类型的指针形参–this,而this指针永远指向调用函数的对象,如此函数便可以识别调用自身的是类的哪个对象了。
这里有一点要注意, C++并没有为静态成员函数定义this指针,如此,静态成员函数被所有的对象共享。
4.总结
通过成员的分开存储和普通成员函数的this指针
C++便可以识别各个不同的对象,如此便实现了面向对象。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!