进程映像:
程序:储存在磁盘中的可执行的文件(二进制文件、脚本文件)
进程:在系统中运行的程序
进程映像:进程的内存的分布情况
text 代码段: 存储的是二进制的指令、常量数据,权限是只读的(可执行),如果强行修改会产生段错误
data 数据段: 存储的是初始化过的全局变量、被初始化过的静态局部变量
bss 静态数据段:存储的是未初始化过的全局变量、未初始化过的静态局部变量,程序运行前会清零
heap 堆: 由程序员手动管理的,手动申请、释放的,使用比较麻烦,特点是:足够大,理论上无限大
stack 栈: 局部变量、块变量,会随着进程运行而申请、释放,由系统管理的。
缺点:大小有限,一次使用过多可能会产生段错误,分配和释放不可控不适合长期使用。
局部变量和全局变量:
全局变量: 定义在函数外的
存储位置: data(初始化过的)或者bss(未初始化过的)
生命周期: main函数运行开始前到程序结束才释放
作用范围: 程序中的任何位置
局部变量: 定义在函数内的
存储位置: stack栈内存
生命周期: 函数的定义语句开始,直到函数执行结束
作用范围:只能在本函数内使用
块变量: 定义在if\for\while等语句块内的变量
存储位置: stack栈内存
生命周期: 函数的定义语句开始,直到函数执行结束
作用范围:只能在语句块内使用
注意:局部变量和全局变量可以同名,但是会屏蔽同名的全局变量,同名块变量会屏蔽同名的局部变量和全局变量
建议:全局变量首字母大写
类型限定符:
auto
用于定义自动申请、自动释放的变量(局部变量),不加代表了加
不能用于修饰全局变量
const
显示地"保护"变量不被修改
但是,如果要强制修改还是可以修改的
如果对初始化过的全局变量,用const修饰后,存储位置从data变成了text
extern
声明外部的全局变量,声明的变量已在别处定义过,请放心使用
但是只能临时通过编译,如果没有定义,链接时依然会报错
只是声明变量,不能赋值
static
被static修饰过的变量称为静态局部变量,局部全局变量
改变存储位置:
改变局部变量的存储位置,由stack改data或者bss(由是否初始化决定)
延长生命周期:
延长局部变量的生命周期
限制作用范围:
限制全局变量、函数只能在本文件内使用
可以防止函数、全局变量重名、防止被别人调用
存储介质:
硬盘->内存->高速缓存->寄存器->CPU
register
申请把变量的存储介质由内存转移到寄存器存储,如果能成功,数据的读取速度会大幅提升,寄存器数量有限,申请可能失败
volatile
编译器的取值优化:
变量的值没有发生改变时,后续的取值会进行优化,不再去内存中读取,而是使用第一次读取的结果,可以节约时间
使用volatile修饰的变量不做取值优化
volatile int num = 10;
if(num == num)
{
//可能为假
}
一般硬件编程和驱动编程时使用
|