简介:本文通过一段简单的代码,帮助读者快速理解C++中栈和堆的数据存取情况。
演示代码:
#include <iostream>
#include<cstdio>
using namespace std;
int a = 0;
static int b = 0;
int main()
{
int Array[100000]; // 在很多编译器定义数组的时候 会默认给数组前端加上static 把数组放到
// 堆上面 因为栈内存可以顺序访问 很珍贵
// 堆理论上是无限的
int c;
int *p = new int (0);
int *q = new int (100);
char *s = "Hello";
cout << &a << " " << &b << " " << &c << " " << &p << " " << p << endl;
printf("%x\n",s);
// 0x489008 0x489010 0x6afee8 0x6afee4 0xd810f8
return 0;
}
// 栈 连续化数组 顺序栈
// 栈,堆,全局
// 栈,顺序栈,数组连续
// 堆,链式存储
首先是需要区分一下,栈和堆的区别:
-
栈:内存条中的一片连续的存储空间,支持顺序读取,读取速度快,但是内存条中这样的连续存储空间很少,所以栈的资源稀少,适合存储一些需要时刻进行读取,而且所占内存较小的数据,比如int,double这些定义的变量。
-
堆:内存条中的离散的存储空间,采取链式存储,读取速度慢,但是由于采取链式存储,所以理论上资源是无限的,适合存放很多占内存较大的数据结构,比如类,和很大的数组,在一些编译器中,当定义的数组非常大的时候,可能就会在编译的时候,默认给数组前面加上static关键字,让他存储在堆上面,扩大存储空间,static修饰的变量是静态全局变量,是存放在堆上面的,全局变量都是存放在堆上面的。