C99:
1、基本概念
程序区:要运行的程序必须加载到内存中,这里的内存就是指程序区。存放2进制代码。
数据区:程序运行过程中需要空间来保存一些变量的值,这部分空间则位于数据区。
注意:1)在这里需要特意说明一下,有很多地方全局变量也可以直接称为静态区,这里将全局区,静态区分开只是为了让分区更加明显。
2)这里的堆,堆栈也就是内存存放程序的变量的区域和数据结构中我们自己建立的堆,堆栈是不同的。二者相同点都是后进先出,但是数据结构中的堆、堆栈一直用用户代码级别的,堆、堆栈内存通过CPU的指令可直接访问。数据结构中的堆、栈是一种逻辑概念,存放局部变量的堆、栈是一种物理概念。要是觉得堆,堆栈,栈这几个东西容易混淆,可以直接记英文,堆:stack,堆栈(栈):heap。
3)“堆栈”和“栈”是相同的一个概念,很多时候,在很多地方“堆栈”的简称就是“栈”。
静态区:静态区的数据将等到程序结束时才消失。
静态数据区中的变量在C程序编译的时候就完成并初始化。(编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码。(以GCC为标准。其他具体参考C编译浅析)),在静态数据区中分配的变量称为静态型变量,它在该程序的整个运行期间都存在,它的生命周期贯穿整个运行周期。C程序的外部变量、static变量都在静态数据区分配存储单元。
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
常量区:专门放常量的地方。函数中的 "adgfdf" 这样的字符串存放在常量区。
动态区:数据随时可能消失。
寄存器区:不属于内存区,主要由CPU决定哪些被访问频繁的变量存放在寄存器中。C语言中程序猿可以使用register申请,但是给不给就看CPU了。
堆栈区(栈区):C程序在函数内(或语句块内)声明的变量是内部变量,它就在堆栈上分配存储空间。这部分存储空间中的变量随时可能消失,调用函数时,这部分变量就在栈上分配存储空间,当函数调用结束时,这部分存储空间就会被自动释放,其所对应的变量就不存在了。
堆区:这部分动态内存空间完全由程序员自己负责管理,它的分配和释放都由程序员自己负责。堆内存是唯一一个可以由程序员自己决定的区间。在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。这部分需要程序要使用指针管理,操作这部分内存。
#include <cstdio>
#include <cstdlib>
#include <string>
int a = 0; //全局初始化区
char *p1; //全局未初始化区
int main(void)
{
int a; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456{post.content}在常量区,p3在栈上
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(10); //分配得来得10字节的区域在堆区;p1在stack中
p2 = (char *)malloc(20); //分配得来得20字节的区域在堆区;p2在stack中
strcpy(p1, "123456"); //123456{post.content}放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块
return 0;
}
CPP
在C++中,内存分成5个区,他们分别是stack、heap、自由存储区、全局/静态存储区和常量存储区
1.栈(stack),就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。
2.堆(heap),就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)