首页 > 系统相关 >内存分区

内存分区

时间:2022-09-21 23:23:34浏览次数:82  
标签:10 常量 int 分区 局部变量 内存 全局

内存分区模型

不同区域存放的数据,赋予不同的生命周期,可以进行更大的灵活编程

在程序编译后,生成exe可执行程序,为执行前分为代码区和全局区

1.代码区

  • 存放函数体的二进制代码,由操作系统进行管理.

  • 存放CPU执行的机器指令

  • 代码区是共享的,为了方便对于频繁被执行的程序,只需要在内存中有一份代码即可

  • 代码区是只读的,防止程序意外修改指令

2.全局区

  • 存放全局变量、静态变量
  • 全局区还包括常量区,字符串常量和其它常量
  • 全局区数据在程序结束后由操作系统释放
  • 常量区中存放const修饰的全局常量和字符串常量
#include <iostream>

using namespace std;
//全局变量
int global_a = 10;
int global_b = 10;
//const修饰的全局常量
const int c_g_a = 10;

int main() {
    //全局区


    //普通局部变量
    int a = 10;
    int b = 10;
    //输出局部变量a、b的地址
    /*这里报错Cast from pointer to smaller type 'int' loses information,
     * 原因是在64位机器上int为4字节,指针全部为8字节,一般来说将int
    改为uintptr_t即可.*/
    cout << "局部变量a的地址为:" << (uintptr_t) &a << endl;
    cout << "局部变量b的地址为:" << (uintptr_t) &b << endl;
    //输出全局变量地址
    cout << "全局变量global_a的地址为:" << (uintptr_t) &global_a << endl;
    cout << "全局变量global_b的地址为:" << (uintptr_t) &global_b << endl;

    //静态变量
    static int s_a = 10;
    static int s_b = 10;
    cout << "静态变量s_a的地址为:" << (uintptr_t) &s_a << endl;
    cout << "静态变量s_b的地址为:" << (uintptr_t) &s_b << endl;

    //常量
    //字符串常量
    cout << "字符串常量的地址为:" << (uintptr_t) &"hello world!" << endl;

    //const修饰的全局变量,const修饰的局部变量
    cout << "const修饰全局常量c_g_a的地址为)" << (uintptr_t) &c_g_a << endl;

    const int c_l_a = 10;
    cout << "const修饰局部变量c_l_a的地址为" << (uintptr_t) &c_l_a << endl;
}

3.栈区

  • 由编译器自动分配内存,存放函数的参数值,局部变量等
  • 不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

4.堆区

  • 由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
  • 使用new在堆区开辟内存
int *func() {
    int *p = new int(100);
    return p;
}

int main() {
    int *p = func();
    cout << *p << endl;
    cout << *p << endl;
    cout << *p << endl;
    cout << *p << endl;

}

使用new关键字,可以将数据开辟到堆区,函数里的指针实质上还是局部变量,放在栈上,指针保存指向堆区数据的地址

标签:10,常量,int,分区,局部变量,内存,全局
From: https://www.cnblogs.com/HanXiaoCao/p/16717588.html

相关文章

  • 内存管理——Hotspot堆创建
    堆创建如何创建堆的过程虽然并不困难,但是涉及到的类比较多所有最好还是记录一下吧,万一忘了就麻烦了,只讨论使用Serial收集器的堆。首先来列举一下关于堆管理的几个类好了:......
  • 内存管理——记忆集和读写屏障
    记忆集和读写屏障由于对堆使用了分代管理,所以在对新生代进行GC的时候需要将老年代对新生代中对象的引用也当做根来看待,所以在根标记的过程中也需要对老年代的引用进行标记......
  • 分区
    分区概述在Oracle数据库中,分区使您能够将非常大的表和索引分解为更小且更易于管理的部分,称为分区。每个分区都是一个独立的对象,具有自己的名称和可选的存储特性。举例......
  • opengauss3.0内存结构
    执行作业最终可用的内存为:max_process_memory–sharedmemory-cstore_buffers查看内存使用信息:pg_total_memory_detail(需要打开内存管理开关)pg_shared_memory_detail......
  • 云服务器分区
    ✍️大多数场景下,云服务器除系统盘外,数据盘没有用到。要对这块数据盘进行分区,挂载,才能使用。很重要,经常用到,尤其是裸盘挂载和使用!场景1:公司金山云服务器,由于数据量巨大,......
  • 二进制到汇编:进制,原码反码补码,位运算,通用寄存器,内存一套打通
    1.语言1.1机器语言人和人沟通的桥梁:语言人与计算机打交道-->学习计算机的语言-->什么是机器语言#我们目前主流的电子计算机!状态:0和1#最早的程序员:穿孔卡带!加......
  • 内存泄漏检测工具总结
    视频1:https://www.bilibili.com/video/BV1hY4y1u7XK/?spm_id_from=333.337.search-card.all.click&vd_source=7a1a0bc74158c6993c7355c5490fc600内存泄漏原因:malloc/new......
  • parted分区步骤
    parted分区步骤概述通常我们用的比较多的一般都是fdisk工具来进行分区,但是现在由于磁盘越来越廉价,而且磁盘空间越来越大;而fdisk工具他对分区是有大小限制的,它只能划分......
  • Unity中Sprite内存和ab大小异常处理方法
    原因:sprite分辨率超过1024*1024时,就会导致sprite中包含了texture的原始数据(未压缩数据),如下图中的astc_6_6,texture是压缩后的只有1.8m,sprite则直接达到了10.9m解决方法:当sp......
  • 如何为swarm中的service设置需要cpu和内存?
    想象一下这个场景,你有一个服务,想要最好的运行状态,必须需要一定的CPU和内存的数量,这样的场景,如何在service中进行设置? 也就是说,为service设置一个cpu和内存的值,swarm集......