c++中变量的内存分配问题

         以下是我对变量内存分配的一些理解,可能不是太正确,我写这篇文章的目的也是为了抛砖引玉,如果大家觉得我哪里有不对,请帮我指出来,谢谢!

        (1)全局类对象:在编译时期就被放置于data segment中并且内容为0,但constructor一直要到程序激活时才会实施,这说明的是全局类对象的内存在编译时已经分配好,并且被默认设置为0.   (吴宏松:源自深度探索c++对象242页的一句话,这句话是好像不是太对,因为编译期是不能分配内存的,编译期分配内存只是把它的内存位置固定好了,然后程序运行的时候,首先就会执行全局变量,静态变量,把它的内存固定好,并且为它设定默认初值0,然后当程序运行到main主函数时,由于编译器在main函数的起始处就调用了_main()函数,并且由于该函数里面有类的构造函数,因此该类的构造函数会被调用,完成对类对象的构造)

 

      (2)全局内部类型变量,静态变量:内存位置在编译期间已经被分配好,然后程序运行的时候,首先就会执行全局变量,静态变量,把它的内存固定好,若有初值,则把初值放进内存(这里是与全局类对象不一样的地方,全局类对象的constructor一直要到main()主函数调用的_main()函数开始执行时才会被调用),否则为它设定默认初值0。

 

     (3)局部变量以及形式参数:在编译期,局部变量的相对地址(相对于它自己的所在的那块数据区的地址)在符号表中被保存,在运行期,当程序运行到数据区模块入口处时,此时该数据区的地址便被固定了,依据符号表中的相对地址,便可以确定每一个变量的地址,然后把他们的相关内容存放进对应地址的内存处

 

     (4)局部静态类对象:保持的语意是:对象的构造和析构函数都必须只能被执行一次。如何保证构造函数只被调用一次(以cfront编译器为例):导入一个临时性对象以保护初始化操作,刚开始时,这个临时性对象为false,当第一次执行constrctor时,判断这个临时性对象为false,于是可以调用constructor,这个临时性对象被置为true,然后后面就不可以再次调用构造函数了,因为他们会判断得到临时性对象为true(深度探索c++248页)

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值