C++的堆与栈
-
当我们程序开始的时,它被分成了一堆不同的内存区域,除了堆和栈还有很多东西,但我们最关心的两个就是堆和栈
-
在应用程序启动后,操作系统要做的就是,他会将整个郑旭加载到内存,并分配一大堆物理ram,以使我们的实际应用程序可以运行
-
栈和堆是ram实际存在的两个区域
- 栈通常是一个预定义大小的内存区域,通常约为2兆字节左右
- 堆也是一个预定义了默认值的区域,但是它可以生长,并且随着应用程序的进行而改变
重要的是,这两个内存区域的 实际位置(物理位置)是一样的,都在ram中
这两个内存区域的实际位置都在我们的内存中
我们的程序中,内存是用来实际存储数据的,我们需要一个地方来存储运行程序所需的数据,不管是局部变量还是从文件中读取的东西。而堆和栈是我们可以存储数据的地方,工作原理非常不同,但本质上他们做的事情是一样的。
我们可以要求C++给我们一些内存(从堆或者栈上)
堆和栈的不同之处在于:
如何为我们分配内存?
例如:我们要存储一个
int
,他是4个字节,我们需要找到一个由四个字节的内存组成的连续快,连续的意思是在一行中。 我们如何找到四个字节的内存块,栈和堆给我们内存的方式是不同的
当我们这样要求内存 的时候,这就叫做内存分配
#include<iostream>
#include<string>
struct Vector3
{
float x, y, z;
Vector3()
:x(10), y(11), z(12){}
};
int main()
{
int value = 5;//在栈上
int array[5];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;
Vector3 vector;
int* hvalue = new int;//在堆上
*hvalue = 5;
int* harray = new int[5];
harray[0] = 1;
harray[1] = 2;
harray[2] = 3;
harray[3] = 4;
harray[4] = 5;
Vector3* hvector = new Vector3();
std::cin.get();
}
栈分配
栈实际上是反向生长的,,比如value
存储在更高的内存地址上,然后数组在他的旁边,一个较低的内存地址。
栈就是把东西一个个叠在一起,,这就是为什么栈分配非常快。他就像一个CPU指令,所做的工作就是移动栈指针,然后返回栈指针的地址
堆分配
每个分配的地址其实没有必然联系
new
关键词:
- 实际上调用了一个叫做
malloc
的函数(memory allocate
),这样做通常会调用底层操作系统或平台的特定函数,这将在堆上为你分配内存。- 当启动程序时,你会得到一定数量的物理ram,程序会维护一个叫做空闲列表(
free list
)的东西,他会跟踪哪些内存块是空闲的,还有他们在哪里,当需要动态内存的时候。- 当使用
malloc
请求内存时候,他会浏览这个空闲列表,然后找到一块和你需要大小相同的内存块
在汇编语言中的区别
栈:只有一条cpu语言
12 : int value = 5;//ÔÚÕ»ÉÏ
mov DWORD PTR value$[rbp], 5
堆
int* hvalue = new int;//ÔÚ¶ÑÉÏ
mov ecx, 4
call ??2@YAPEAX_K@Z ; operator new
mov QWORD PTR $T5[rbp], rax
mov rax, QWORD PTR $T5[rbp]
mov QWORD PTR hvalue$[rbp], rax
标签:harray,cherno,int,mov,C++,课程,内存,new,array From: https://www.cnblogs.com/jackjie/p/17065218.html性能的不同是由于分配的不同