首页 > 编程语言 >C++堆与栈【cherno课程学习】

C++堆与栈【cherno课程学习】

时间:2023-01-23 15:22:08浏览次数:41  
标签:harray cherno int mov C++ 课程 内存 new array

C++的堆与栈

  1. 当我们程序开始的时,它被分成了一堆不同的内存区域,除了堆和栈还有很多东西,但我们最关心的两个就是堆和栈

  2. 在应用程序启动后,操作系统要做的就是,他会将整个郑旭加载到内存,并分配一大堆物理ram,以使我们的实际应用程序可以运行

  3. 栈和堆是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关键词:

  1. 实际上调用了一个叫做malloc的函数(memory allocate),这样做通常会调用底层操作系统或平台的特定函数,这将在堆上为你分配内存。
  2. 当启动程序时,你会得到一定数量的物理ram,程序会维护一个叫做空闲列表(free list)的东西,他会跟踪哪些内存块是空闲的,还有他们在哪里,当需要动态内存的时候。
  3. 当使用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

相关文章