一、内存基本概念
1.c++内存布局
如果的c++程序内存分布中, code segment放可执行程序的机器码
data segment存放已初始化的全局和静态变量,常量数据(如字符串常量)
bss(block started by symbol),存放未初始化的全局和静态变量(默认设为0)
heap 堆, 程序动态分配的内存在此区域
stack 栈, 由编译器自动管理分配,程序中的局部变量、函数返回值、返回变量等存在此区域
系统载入可执行程序段,将BSS段的数据载入数据段,将内存初始化为0,再调用程序入口(main函数)
(1)函数栈
可执行文件包括 BSS dataSegment codesegment
可执行文件载入内存后,系统会保留一些空间,即为堆区和栈区
堆区用于动态分配内存,栈区主要是函数和局部变量等
调用函数时,一块连续内存(堆栈帧)会压入栈
函数返回时,堆栈帧弹出
堆栈帧包含如下数据:
- 函数返回地址
- 局部变量/CPU寄存器数据备份
2.内存对齐
基础类型,如float double int char等, 他们大小和内存占用一致
对于结构体而言,进行了内存对齐,所以sizeof 可能大于结构体内所有成员总和
(1)为什么进行内存对齐
内存对齐使得数据读取更高效,处理器只能从地址为k的倍数的内存处开始读取数据,
某些平台不内存对齐会崩溃
(2)内存对齐的规则
有效对齐值为结构体中的最宽成员和编译器/用户指定的对齐值中 较小的那个
每个成员要进行对齐, 并且整个结构体也需要对齐
成员对齐需要是成员有效对齐值的整数倍
(成员对齐是有效对齐值和自身大小中的最小值)
3.继承类布局
(1)一个类继承自另一个类,它自身的数据位于父类之后
(2)含虚函数的类
如果当前类包含虚函数,则会在类的最前端占用4个字节,用于存储虚表指针,它指向一个虚函数表
虚函数表中包含当前类的所有虚函数
4.字节序
小端:低位有效字节存储于较低的内存位置
大端:高位有效字节存储于较低的内存位置