编译期内存分配

 所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局

变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以 明确计算

出来,并且不会再改变,因此它们可以直接存放在可执行文件的特定的节里(而且包含

初始化的值),程序运行时也是直接将这个节加载到特定的段中,不 必在程序运行期

间用额外的代码来产生这些变量。


其实在运行期间再看“变量”这个概念就不再具备编译期间那么多的属性了(诸如名称

,类型,作用域,生存期等等),对应的只是一块内存(只有首址和大小), 所以在

运行期间动态申请的空间,是需要额外的代码维护,以确保不同变量不会混用内存。比

如写new表示有一块内存已经被占用了,其它变量就不能再用它了; 写delete表示这块

内存自由了,可以被其它变量使用了。(通常我们都是通过变量来使用内存的,就编码

而言变量是给内存块起了个名字,用以区分彼此)


内存申请和释放时机很重要,过早会丢失数据,过迟会耗费内存。特定情况下编译器可

以帮我们完成这项复杂的工作(增加额外的代码维护内存空间,实现申请和释 放)。

从这个意义上讲,局部自动变量也是由编译器负责分配空间的。进一步讲,内存管理用

到了我们常常挂在嘴边的堆和栈这两种数据结构。


最后对于“编译器分配空间”这种不严谨的说法,你可以理解成编译期间它为你规划好

了这些变量的内存使用方案,这个方案写到可执行文件里面了(该文件中包含若干并非

出自你大脑衍生的代码),直到程序运行时才真正拿出来执行!

 

关于这点我的理解:


书上的确可以看到,关于编译时就分配内存的概念,比如:“当一个数组被声明时,它

所需要的内存在编译时就被分配了。”

当我看到这时也很迷惑,认真思考后认为,它的意思是变量的内存大小被分配了,内存

地址当然是不知道的。我们把这种分配方式叫静态分配。

全局和静态数据在编译时就静态分配了,但它们在加载到内存之前是不占“太多磁盘空

间”,它在磁盘上以ELF或其它格式存储时,只有一些描述信息,并不是你声明了一个

很大的数组就会占很大的磁盘空间,它们在加载到内存后才变大的。加载器按静态分配

时的大小,为它在内存中分配固定的空间。


所以全局数据,无论是初始化的,还是未初始化的,在内存中都是占它实际大小的内存

的。但在ELF格式时,只占一些描述符所需大小的磁盘空间。


C,C++内存模型从上到下一次是栈区,堆区,全局区,常量区,代码区

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值