C/C++ 程序内存结构

楔子

一个可执行程序文件需要在计算机硬件上运行起来,其实质就是静态的文件被加载到内存中的过程,可执行程序文件只是一个程序的载体。那么执行一个应用后,它在内存中是一个怎样的结构呢,请关注今天的走进科学——《C/C++ 程序内存结构》。

动&静

一个程序被加载到内存中,这块内存首先就存在两种属性:静态分配内存和动态分配内存。
静态分配内存:是在程序编译和链接时就确定好的内存。
动态分配内存:是在程序加载、调入、执行的时候分配/回收的内存。

Text & Data & Bss

  • .text: 也称为代码段(Code),用来存放程序执行代码,同时也可能会包含一些常量(如一些字符串常量等)。该段内存为静态分配,只读(某些架构可能允许修改)。
    这块内存是共享的,当有多个相同进程(Process)存在时,共用同一个text段。

  • .data: 也有的地方叫GVAR(global value),用来存放程序中已经初始化的非零全局变量。静态分配。

    • data又可分为读写(RW)区域和只读(RO)区域。
      -> RO段保存常量所以也被称为.constdata
      -> RW段则是普通非常全局变量,静态变量就在其中
  • .bss: 存放程序中为初始化的和零值全局变量。静态分配,在程序开始时通常会被清零。

text和data段都在可执行文件中,由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
这三段内存就组成了我们编写的程序的本体,但是一个程序运行起来,还需要更多的数据和数据间的交互,否则这个程序就是死的,无用的。所以我们还需要为更多的数据和数据交互提供一块内存——堆栈。

堆栈(Heap& Stack)

堆和栈都是动态分配内存,两者空间大小都是可变的。

  • Stack: 栈,存放Automatic Variables,按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。

  • Heap: 堆,自由申请的空间,按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。
    每个线程都会有自己的栈,但是堆空间是共用的。

Tips:

char* p = new char[20];
// 这行代码在Heap中开辟了20个char长度的空间,同时在Stack上压入了p,
// 指针变量p存在于栈上,其值为刚刚在堆上开辟的空间的首地址。

图解

sw-at 的博客上扒了一张图,这张图中所示内存空间,地址由下往上增长,分别标示了 .text、.data、.bss、stack和heap的内存分部情况。
我们可以看到:

  • text、data(gvar)、bss 在内存中地址较低低的位置(low level address),而堆栈则在相对较搞的位置。
  • 堆(Heap)往高地址方向生长,栈(Stack)往低地址方向生长。

memery

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C/C++语言程序开发开放参考手册的PDF版本是一本非常重要的参考书籍,它为C或C++语言编程提供了全面的指导和参考。这本手册通常包含了C或C++语言的各种语法规则、关键字、函数库、操作符和其他编程元素的详细解释和用法示例。 通过阅读这本开放参考手册,程序开发人员可以快速查找C/C++语言的相关信息和技巧,以帮助他们更高效地开发程序。手册中的内容包括但不限于:数据类型、控制结构、函数定义和调用、数组和指针、文件操作、内存管理等。 对于初学者来说,这本手册是学习C/C++语言的良好起点。它提供了简洁清晰的示例代码和解释,帮助读者理解各个概念和语法规则。通过阅读手册,初学者可以逐渐提升自己的编程能力,并掌握C/C++语言的基础知识。 对于有经验的程序开发人员来说,这本手册可以作为日常工作中的参考书。无论是在解决问题、调试代码还是进行代码优化时,手册中的各种技术细节和用法示例都能提供帮助。通过查阅手册,程序开发人员可以更快地找到需要的信息,减少错误和不必要的麻烦。 总的来说,C/C++语言程序开发开放参考手册是程序开发人员必备的参考资料之一。它不仅在学习阶段提供了指导,还在实际编程中提供了技术支持。无论是初学者还是有经验的程序开发人员,都可以从中获得丰富的知识和指导。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值