CPU处理数据速度
寄存器 > 高速缓存 > 内存 > 硬盘->u盘
大致同等条件下,那个设备价格高那个速度快
CPU Cache CPU高速缓存,仅次于CPU寄存器。容量小于内存速度接近处理器。
当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果命,则不经内存直接返回该数据;如果失效,则要先把内存中的相应数据载入缓存,再将其返回处理器。
缓存之所以有效,Spatial Locality 时间局部性Temporal Locality。合理使用局部性,可提高命中率。
数据存放位置
在C语言中变量可以存放在3个地方:普通内存,运行时的堆栈,CPU内部的通用寄存器。
在函数外声明的变量都是全局变量,默认下,全局变量的作用域仅限于声明该变量的C文件中,.c使用extern关键字声明.h关键字extern重新声明。编译器时将全局变量映射在普通内存中始终占用编译器为它分配的内存空间始终保持原来的值
c 语言数据区
栈区 堆区 数据区 代码区
栈区
编译器自动分配释放,存放函数的参数值,局部变量等,函数执行完空间自动释放。有初始大小可改默认2M。
linux ulimit -s
线程栈大小是固定的,ulimit -a 显示
进程的栈大小进程执行时指定,非编译链接指定
堆区
程序员分配释放(如动态内存申请),若不释放,程序结束操作系统回收。new和malloc由低到高分配,释放delete或free.
堆的大小理论上 ≈ 进程虚拟空间- 内核虚拟内存。
Linux下进程的高位1G内核用,低位3G用户用,进程堆大小小于3G
线程栈大小是固定的,ulimit -a 显示值
进程的栈大小进程执行时指定,非编译链接定
数据区
常量区:存放常量,如字符串常量。
全局区(静态区):全局变量和静态变量。程序结束后由操作系统释放。
程序代码区
存放函数体的二进制代码,操作系统管理。