- 我们用sizeof计算类的大小的时候,只有类的成员变量会被计算到类的大小里面,因为每个单独的类对象都有其独有的成员变量和值, 系统需要为每个类对象的成员变量单独分配内存,然而成员函数则为所有类对象共享。下面我们就来讲讲C++中,对于数据的存储的分配方式:
- 首先这里有一个计算机分配内存的概念.
- 当往内存存储数据时, 是从低位往高位存储
- 当内存开辟空间时, 内存的分配是从高位到低位
- 在C++编译系统中,数据和函数是分开存放的。如下为内存分布说明
- 函数存放在代码区(Text segment):存放可执行代码,只读常量
- 数据区BSS(segment 和Data segment):存储全局数据和静态数据,其中BSS segment 存储未初始化的全局数据和静态数据
- 堆(Heap): 用于程序运行时内存动态分配, 向上增长
- 内存映射段(Memory mapping Segment):文件映射,动态库,匿名映射, 例如lib、libc.so。 最高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。
- 栈(Stack):非静态局部数据(局部变量函数参数、返回值等)存储区, 向下增长
- 内核空间(Kernel space):存放操作系统相关的代码和数据(用户不能直接操作,可以通过调用操作系统提供的Api函)
- 首先这里有一个计算机分配内存的概念.
操作系统内存分布图