云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

堆、栈,还是 堆栈 堆栈和堆

jxf315 2024-12-30 04:48:49 教程文章 34 ℃

关注微信公众号 老卢私塾


堆、栈

先明白一点:一些教材上写的(stack)其实只是

进程内存地址空间(内核ring0、用户ring3)


先说下静态数据区,一会再说栈、堆

static变量和全局变量的生命周期是一样的:从出生到程序结束。二者都存放在静态存储区。

本文只讨论ring3用户栈,以便与ring0内核栈区分开来。

内核栈是每个进程保留在内核内存中的内存区域,供(内核)内部函数调用时使用。用户栈驻留在不受保护(用户可操作)的用户内存中

l 堆heap

堆是先进先出的

堆空间的增长方向是从低地址向高地址增长

new,malloc/alloc是在堆上申请内存

堆的可用空间远大于栈空间

l 栈stack

栈是先进后出的

栈空间的增长方向是从高地址向低地址增长

栈的作用是局部变量(如函数实参)、函数call堆(调用函数时的寄存器信息)

每次调用函数时,会在栈上新分配一帧,每当函数返回时,再从栈上将此帧移去。

用专用寄存器:

1. ESP(栈顶指针)指向栈最上面一个栈帧的栈顶

2. EBP(栈底指针)指向栈最上面一个栈帧的底部

ESP-EBP=栈的大小

函数内的变量都可通过EBP加偏移量找到

Tags:

最近发表
标签列表