C/C++ 内存四区:代码区 全局区 栈区 堆区

程序的生成文件在内存中的存放,按照读写性质分为:只读部分可读写部分

    只读部分:程序代码  和 程序中的常量

    可读写部分:全局区堆区栈区

 

编写程序一定要清楚 不同内存区域的存放对象 及 生命周期

可以将内存分为四个区域:代码区,全局区,栈区,堆区

1.代码区:

存放 CPU 执行的机器指令

你所写的所有代码都会放入到代码区中,代码区的特点共享只读

通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。

代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。

2.全局区:

   全局区内存(静态区、数据区、全局静态区、静态全局区) 在程序编译的时候就已经分配好,这块内存在程序的生命周期整个运行期间都存在。它主要存放静态数据、全局数据和常量。   

   全局区中主要存放的数据有:

       全局变量、

       静态变量(static int a;)

       常量(const int a = 5 ; )

   全局区可以细分为data区和bss区

      2.1、data区

      data区里主要存放的是已经初始化的全局变量、静态变量和常量

      2.2、bss区

      bss区主要存放的是未初始化的全局变量、静态变量,这些未初始化的数据在程序执行前会自动被系统初始化为0或者NULL

      2.3、常量区

      常量区是全局区中划分的一个小区域,里面存放的是常量,如const修饰的全局变量、字符串常量等

3.栈区:

   栈是一种先进后出的内存结构,由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期到释放该段栈空间

 

4.堆区:

   堆是一个大容器,它的容量要远远大于栈,但没有栈那样先进后出的顺序。用于动态内存分配,存放程序员申请的变量。比如使用malloc, realloc,free,new 和 delete 函数控制的变量 。一般由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。堆区变量在所有的线程,共享库,和动态加载的模块中被共享使用

通过以下程序,打印出相应变量的地址就可以看出:

#include <iostream>
using namespace std;

//可编程区域,全局区,堆区,栈区
static int a = 0;
const string name = "shanghai";
int bi = 6;

int main()
{
	int hua = 0;
	string tu = "a";
	int* b = new int(8);
	int* g = new int(6);
	cout << "静态变量a:" << &a << endl;
	cout << "常量name:" << &name << endl;
	cout << "全局变量bi:" << &bi << endl;
	cout << "堆区变量b:" << b << endl;
	cout << "堆区变量g:" << g << endl;
	cout << "栈区变量hua:" << &hua << endl;
	cout << "栈区变量tu:" << &tu << endl;
}

程序执行结果如下:

通过执行结果,还可以看到:

    堆区 和 栈区  的 内存分配增长方向是相反的。

    堆区: 向高地址增长

    栈区: 向低地址增长

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值