1. 内存分配方式
栈(Stack)
自动分配/释放:由编译器自动管理,内存分配和释放遵循作用域规则(如函数调用结束或局部变量超出作用域时自动释放)。
堆(Heap)
手动分配/释放:需通过 new/malloc 显式申请内存,通过 delete/free 显式释放。
自由分配:内存块可以在任意时间分配和释放,但需程序员自行管理,否则会导致内存泄漏。
2. 生命周期
栈
与作用域绑定:变量在定义时创建,在离开作用域(如函数返回、代码块结束)时自动销毁。
无需手动管理:适合生命周期短暂的临时变量(如局部变量、函数参数)。
堆
显式控制:内存的生命周期由程序员决定,直到显式调用 delete/free 才会释放。
灵活性高:适合需要长期存在或动态调整大小的数据(如全局数据结构、动态数组)。
3. 内存大小限制
栈
固定大小:通常较小(默认几 MB,取决于系统和编译器设置)。
栈溢出风险:过度分配(如大数组、深度递归)会导致栈溢出(Stack Overflow)。
堆
大内存池:可用空间远大于栈(受限于系统可用内存)。
适合大对象:动态分配大型数据结构(如链表、树、图像数据)。
4. 访问速度
栈
极快:内存地址连续,通过指针简单移动分配/释放,无碎片问题。
堆
较慢:需通过动态内存管理算法查找可用内存块,可能产生内存碎片。
5. 内存碎片
栈
无碎片:严格按 LIFO 顺序分配/释放,内存始终连续。
堆
可能产生碎片:频繁分配/释放不同大小的内存块会导致内存碎片,降低利用率。
6. 线程安全性
栈
线程私有:每个线程有自己的栈,线程间互不干扰。
堆
全局共享:所有线程共享堆内存,需同步机制(如锁)保证线程安全
44万+

被折叠的 条评论
为什么被折叠?



