在书写的有这么一句话让我不解,
它说类的静态数据成员是在程序在编译是被分配的内存空间的,在程序结束是释放空间
我的疑惑是程序在编译的时候怎么分配内存空间?
编译不是把我们写的源代码汇编成二进制代码吗,最后成为一个可执行文件。
然后我们双击这个可执行文件,这时候这个可执行文件才被载如内存,只有载如了内存才可以分配空间啊。
关键是程序编译的时候都不在内存中怎么给它分配空间啊?
还望大家不吝赐教!谢谢!

解决方案 »

  1.   

    编译时分配空间指的是分配虚拟内存(在windows上说分配内存都是虚拟内存)
    所谓的分配内存空间就是给他分配一个固定的地址,不光静态数据成员是,函数中使用的成员都是编译时分配的;
    这里说的编译时分配主要区别于你使用malloc或者new这样的动态分配(动态分配,运行时分配),malloc和new在编译时不能确定要分配多少,所以编译器就无法确定要给它那个地址
      

  2.   

    补充:
    段地址是程序运行时操作系统分配的。
    malloc,new这种操作是在操作系统的内存堆(heap)上分配的。
      

  3.   

    感谢lixung,那malloc或者new这样的动态分配(动态分配,运行时分配),malloc和new在编译时不能确定要分配多少,
    为什么编译器不能确定malloc和new要分配多少呢?
      

  4.   

    你可以这么理解,把“编译”两个字改成运行的。改变后那句话就变成了
    在程序在运行的时候,静态数据成员是从一开始就分配了空间了的,直到程序结束时释放空间。解释:这个不同函数里面声明的变量,函数里面声明的变量,是调用函数的时候,才分配的。这个样,你理解了吧。当然,原来的那句话也是对的,编译的时候,也是先把他们放到内存里面的,要不怎么编译?所以,这个时候,也是先把静态的成员放到一个地方处理。至于malloc这样的动态分配,编译时是不分配的吧,这个很好理解啊,编译就是转换成二进 制代码嘛, 怎么会管你运行的结果呢?而malloc运行的结果是分配内存嘛。所以编译时当然编译器不管这个问题了
      

  5.   


    为什么编译器不能确定malloc和new要分配多少呢?你查一下malloc参数,是个变量!所以没办法确定要分配多少,只有运行时,变量有了具体指才知道大小
      

  6.   

    感谢lixung,我懂了,收获不少啊。