首先我们要了解一个东西,代码在计算机中是怎么运行的,相信大家都略有了解,但是大部分人都是模模糊糊,今天我就给大家详细讲解栈空间是什么(书籍上面是找不到的,以下是我个人的理解),首先编译好以后的代码会经历从低地址<代码段>(可执行代码)到高地址<内核地址空间>的一个过程。具体过程是代码段->数据段->堆空间(Heap)->共享库和内存映射区->栈空间(Stack)(我们的重头戏)->命令行参数->环境变量->内核地址空间。而我们的栈空间则是非常关键的一部分。毫不夸张的说当你理解完这篇文章的内容就能够看到高级程序员的门槛了。首先什么叫栈空间?简单来说栈空间就是存放函数以及函数内部变量的空间。栈空间分配给其他函数的内存称为栈帧,这里给初学者补充一个小知识点,1000字节=1kb,1024字节=1kib。当然了,我们的硬盘以1000字节=1kb为准。至于后面大家感兴趣的可以查阅相关资料。或者后续我在更新一篇。而我们的栈空间大小默认为2M。那么该怎么分配“栈帧”呢,为了更方便讲解,我贴了第一张图片。简单来说除了主函数要分配栈空间以外,每调用一个函数都会分配内存也就是“栈帧”。那么每一个栈帧的大小是多少呢。在此之前,我们先看一个bug(图二),(图三)。很多新手可能会遇到这样的问题,下意识的认为数组不能定义太大,会形成一个笼统的意识。但这对于以后的发展非常受限。那么栈空间究竟该怎么分配呢。函数中的变量的大小就是函数分配的栈帧大小,由于图片限制,我将源代码放在下面给需要的人拿去测试(这里为了简便我使用了递归函数)。
#include<iostream>
#include<windows.h>
using namespace std;
void test(int n)
{
char str[1024 * 100];
cout << n << endl;
printf("%X\n", str);
if (n == 1)
{
return;
}
test(n - 1);
}
int main()
{
int n = 0;
cout << "请输入要测试的数" << endl;
cin >> n;
system("cls");
test(n);
return 0;
}
这里我们可以看到打印信息(注意打印出的地址为16进制性需要转化),然后我们可以发现他们之间相减就是数组的大小,很明显,栈帧分配的大小就是函数内部变量的大小。
希望大家看完有所收获,然后我会在下一篇文章将递归这个坑填好,以便于大家整体理解,如果对你有帮助的话不妨点个大拇指。
谢谢大家观看 ---------------------玉无涯