内存分配方式
- 栈:由编译器自动分配释放,存放函数的参数值、局部变量等。在函数执行时,相关变量会依次压入栈中,函数结束时,这些变量又会从栈中弹出。例如,在如下代码中,
int a = 10;
变量 a
就被分配在栈上:
void func() {
int a = 10;
}
- 堆:由程序员手动分配释放。通过
new
(C++)或 malloc
(C 兼容)等函数来申请一块堆内存,例如 int* ptr = new int(10);
,这里通过 new
为一个 int
类型的数据在堆上分配了内存,并返回指向这块内存的指针 ptr
。
内存管理机制
- 栈:内存管理由编译器自动处理。当函数结束时,栈上的变量会自动被销毁,无需程序员手动干预。这种自动管理机制使得栈内存的使用相对简单,不容易出现内存泄漏问题。
- 堆:需要程序员手动管理。使用
new
或 malloc
分配的内存,必须使用 delete
(C++)或 free
(C 兼容)来释放。如果忘记释放,就会导致内存泄漏。例如:
int* ptr = new int(10);
// 如果后续没有执行 delete ptr; 就会造成内存泄漏
分配效率
- 栈:分配效率高。因为栈的分配和释放是由编译器自动完成,并且栈操作遵循后进先出(LIFO)原则,类似于数据结构中的栈,在栈顶进行操作,速度非常快。
- 堆:分配效率相对较低。堆内存的分配需要在堆内存空间中寻找合适大小的空闲块,这个过程涉及到复杂的算法(如首次适应、最佳适应等)来找到合适的内存块,并可能需要进行内存块的分割和合并等操作,因此相对栈的分配来说,效率会低一些。