
1. 初步了解-程序内存分配
由C / C ++编译的程序所占用的内存分为以下几部分
1. 堆栈区域(堆栈)由编译器自动分配和释放,用于存储函数参数值,局部变量值等.
操作模式类似于数据结构中的堆栈.
2,通常由程序员分配和释放的堆(heap),如果程序员不释放,则操作系统可能会在程序结束时将其返回
接收. 请注意,它与数据结构中的堆不同,并且分配方法类似于链表,哈哈.
3. 全局区域(静态区域)(静态)-全局变量和静态变量的存储放在一起并初始化
全局变量和静态变量在一个区域中,未初始化的全局变量和未初始化的静态变量彼此相邻
一个区域. -程序结束后由系统释放.

4. 文本常量区域常量字符串位于此处. 程序结束后由系统释放
5. 程序代码区-存储函数体的二进制代码.
第二个示例程序
这是一个非常详细的高级文章
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456/0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"
优化成一个地方。
}
第二,堆和栈的理论知识
2.1如何申请
堆栈:
由系统自动分配. 例如,在函数中声明一个局部变量int b. 系统会自动为堆栈中的b打开空间

间隔
堆:
需要自己申请程序员,并在c中指定大小,malloc函数
例如p1 =(char *)malloc(10);
在C ++中使用new运算符
例如p2 = new char [10];
但是请注意,p1和p2在堆栈中.
2.2申请后的系统响应
堆栈: 只要堆栈的剩余空间大于请求的空间,系统就会为程序提供内存,否则将报告异常以指示堆栈溢出

出去.
堆: 首先,您应该知道操作系统有一个记录空闲内存地址的链表. 当系统从程序接收到应用程序时,
将遍历链表,找到第一个空间大于请求空间的堆节点,然后从空闲节点列表中删除该节点
删除它,并将节点的空间分配给程序. 此外,对于大多数系统而言,它将位于此内存空间中
在第一个地址处记录此分配的大小,以便代码中的delete语句可以正确释放内存空间.
此外,由于找到的堆节点的大小可能与应用程序的大小不完全相同,因此系统会自动删除多余的
将点数放回空闲列表中.
2.3应用程序大小限制
堆栈: 在Windows中,堆栈是一种扩展到低位地址的数据结构,并且是一个连续的内存区域. 这句话的意思

认为,堆栈顶部的地址和堆栈的最大容量是由系统预先定义的. 在WINDOWS下,堆栈的大小为2M(也
为1M,简而言之,它是在编译时确定的常数. 如果请求的空间超过了堆栈的剩余空间,它将
提示溢出. 因此,堆栈中可用的空间较小.
堆: 堆是一种扩展到高地址的数据结构,并且是一个不连续的内存区域. 这是因为系统使用链表进行存储
的可用内存地址
自然是不连续的,并且链表的遍历方向是从低地址到高地址. 堆的大小
受计算机系统中有效虚拟内存的限制. 可以看出,堆获得的空间更加灵活,更大.
2.4应用效率比较:
系统自动分配堆栈,速度更快. 但是程序员无法控制它.
堆是new分配的内存,通常较慢并且容易出现内存碎片,但是使用起来最方便.
此外,在WINDOWS下,最好的方法是使用VirtualAlloc分配内存,它既不在堆上,也不在堆栈上
直接在进程的地址空间中保留一块内存,尽管使用起来最不方便. 但这是最快,最灵活的.
2.5在堆和堆栈中存储内容
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-310907-1.html
它已超出了双边或多边的范畴
咱也不想炒股
真牛逼