|
|
|
@ -57,11 +57,8 @@ int* foo() {
|
|
|
|
|
|
|
|
|
|
#### 性能区别
|
|
|
|
|
|
|
|
|
|
写入方面:入栈比在堆上分配内存要快,因为入栈时操作系统无需分配新的空间,只需要将新数据放入栈顶即可。相比之下,在堆上分配内存则需要更多的工作,这是因为操作系统必须首先找到一块足够存放数据的内存空间,接着做一些记录为下一次分配做准备。
|
|
|
|
|
|
|
|
|
|
读取方面:得益于 CPU 高速缓存,使得处理器可以减少对内存的访问,高速缓存和内存的访问速度差异在 10 倍以上!栈数据往往可以直接存储在 CPU 高速缓存中,而堆数据只能存储在内存中。访问堆上的数据比访问栈上的数据慢,因为必须先访问栈再通过栈上的指针来访问内存。
|
|
|
|
|
|
|
|
|
|
因此,处理器处理分配在栈上数据会比在堆上的数据更加高效。
|
|
|
|
|
在栈上分配内存比在堆上分配内存要快,因为入栈时操作系统无需进行函数调用(或更慢的系统调用)来分配新的空间,只需要将新数据放入栈顶即可。相比之下,在堆上分配内存则需要更多的工作,这是因为操作系统必须首先找到一块足够存放数据的内存空间,接着做一些记录为下一次分配做准备,如果当前进程分配的内存页不足时,还需要进行系统调用来申请更多内存。
|
|
|
|
|
因此,处理器在栈上分配数据会比在堆上分配数据更加高效。
|
|
|
|
|
|
|
|
|
|
#### 所有权与堆栈
|
|
|
|
|
|
|
|
|
|