C++内存布局

C++内存布局

1.文字介绍

1.内核态空间

2.用户态空间
(1)栈区:存储局部变量函数调用的相关信息,栈的特点是自动分配和释放,由操作系统管理。栈由高地址向低地址生长,通常为0x7ff
(2)堆区:堆区用于动态分配的内存(new、malloc),由程序员分配,由低地址向高地址生长,堆区与栈区没有明确的界限,通常为0x5
(3)全局/静态区:读写段(数据段),存放全局变量、静态变量。
分为:①已初始化数据段.data ②未初始化数据段.bss
(4)文字常量区:只读段.rodata,存放程序中直接使用的常量,如 字符串常量、整数常量、浮点数常量
(5)程序代码区:只读段,存放函数体的二进制代码



2.图片介绍

在这里插入图片描述
在这里插入图片描述



3.代码介绍

(1)堆比栈的地址更低
(2)堆区是动态分配的,地址不一定连续
(3)全局变量在堆之下
(4)静态变量 和 全局变量是混合存放的。先定义的在低地址。

//memory_layout.cpp
#include <stdio.h>
#include <iostream> 
using std::cout;
using std::endl;

int global_num = 1;

int main()
{
    int num = 1;          //栈变量
    cout << "栈变量1的地址 :" << &num << endl; //输出栈变量的地址:0x7ffc2050a440
    int num2 = 2;          //栈变量
    cout << "栈变量2的地址 :" << &num2 << endl; //输出栈变量的地址:0x7ffc2050a444

    int *p = new int(1);  //堆变量
    cout << "堆变量的地址  :" << p << endl;    //输出堆变量的地址:0x56bb74428280
    int *p2 = new int(2);  //堆变量
    cout << "堆变量2的地址 :" << p2 << endl;    //输出堆变量的地址:0x56bb744282a0
    //对比发现,堆变量的地址比栈变量低
    //即,堆变量是低地址,栈变量是高地址

    cout << "全局变量的地址:" << &global_num << endl; //0x56bb73306010

    static int static_num = 1;
    cout << "静态变量的地址:" << &static_num << endl; //0x56bb73306014
    //对比可以发现,全局变量和静态变量是混合存放的。略低于堆区
    
    const char * pstr = "hello";
    cout << pstr << endl;   //hello    cout会默认重载char *
    printf("文字常量区的地址:%p\n", pstr);   //0x56012fd1ddab
    cout << "文字常量区的地址:"<< static_cast<void *>(const_cast<char*>(pstr))<<endl;
    //发现文字常量区,比全局静态区的地址更低
    
    printf("main函数的地址:%p\n",&main);
    //发现程序代码段,比文字常量区更低
    return 0;
}

在这里插入图片描述

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员爱德华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值