【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 协议 ,转载请注明出处!