C/C++ 内存四区:代码区 全局区 栈区 堆区
作者:互联网
编写程序一定要清楚 不同内存区域的存放对象 及 生命周期。
可以将内存分为四个区域:代码区,全局区,栈区,堆区
1.代码区:
存放 CPU 执行的机器指令。
你所写的所有代码都会放入到代码区中,代码区的特点是共享和只读。
通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。
代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。
2.全局区:
全局区内存(静态区、数据区、全局静态区、静态全局区) 在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
全局区中主要存放的数据有:
全局变量、
静态变量(static int a;)
常量(const int a = 5 ; string name = "shanghai")
这部分可以细分为data区和bss区
2.1、data区
data区里主要存放的是已经初始化的全局变量、静态变量和常量
2.2、bss区
bss区主要存放的是未初始化的全局变量、静态变量,这些未初始化的数据在程序执行前会自动被系统初始化为0或者NULL
2.3、常量区
常量区是全局区中划分的一个小区域,里面存放的是常量,如const修饰的全局变量、字符串常量等
3.栈区:
栈是一种先进后出的内存结构,由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间。
4.堆区:
堆是一个大容器,它的容量要远远大于栈,但没有栈那样先进后出的顺序。用于动态内存分配。比如使用malloc()函数申请的内存 ,使用new创建的对象。一般由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
通过以下程序,打印出相应变量的地址就可以看出:
#include <iostream>
using namespace std;
//可编程区域,全局区,堆区,栈区
static int a = 0;
string name = "shanghai";
int bi = 6;
int main()
{
int hua = 0;
string tu = "a";
int* b = new int(8);
cout << "静态变量a:"<<&a << endl;
cout << "常量name:"<<&name << endl;
cout << "全局变量bi:" << &bi << endl;
cout << "堆区变量b:"<<b << endl;
cout <<"栈区变量hua:"<< &hua << endl;
cout << "栈区变量tu:" << &tu << endl;
}
程序执行结果如下:
标签:栈区,常量,int,四区,代码,C++,存放,内存,全局 来源: https://blog.csdn.net/Appleeatingboy/article/details/117733883