请教高手,程序编译时和运行时有什么不同?

papaofdoudou
人工智能领域新星创作者
博客专家认证
2009-05-08 07:59:42
全局变量和静态全局变量等具有文件作用域的变量在声明后在在编译的时候分配内存空间吗?
还有:如果类的定义改变了,例如增加了数据成员,那么利用这个类的客户,比方说客户声明了此类的一个对象,这个对象是在重新编译的时候被替换还是在程序运行的时候?当然类对象的定义和类的定义不在同一个源文件下。
如果声明一个全局数组,例如int a[10], 必须在编译的时候将数组大小确定,这是不是说明,在编译的时候将为此数组分配内存空间????、如果重新编译的话会使客户对象重新生成,那么数组就应该是在编译的时候分配的内存空间对吗?声明一个局部函数内的数组呢??
加入声明的数组带有初始化,即这样int a[10]={0,1,2},那么这些初始化时在运行的时候还是在编译的时候?如果是在运行时,那在编译的时候为什么还要分配内存空间?

好多疑问,请高手不吝指教!
...全文
577 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
o0MyBelieve0o 2009-05-08
  • 打赏
  • 举报
回复
学习下!! 猛顶!!
hjjdebug 2009-05-08
  • 打赏
  • 举报
回复
完善一下14楼提法:
所谓分配内存可能提法不当,应该叫确定内存则比较严谨。所以14楼可概括为。
全局变量,静态变量在编译期确定内存,局部变量在运行期确定内存。

所谓分配内存,程序中只有new(或malloc)来动态分配内存。 其它的如程序,数据是由加载器依据exe文件分配的,我们不需要管理。栈的位置到运行期确定。知道了这些很多问题就可以解了。 有时候自己可能有些词不
达意或用词不当,以后还要引以为戒。
fuzzy_man 2009-05-08
  • 打赏
  • 举报
回复
全局变量和静态全局变量等具有文件作用域的变量在声明后在在编译的时候分配内存空间吗?
不能算分配空间,但是在编译生成文件(一般是bin文件)的rw段中存放这些数据。没初始化的这类变量会在zi段。
还有:如果类的定义改变了,例如增加了数据成员,那么利用这个类的客户,比方说客户声明了此类的一个对象,这个对象是在重新编译的时候被替换还是在程序运行的时候?当然类对象的定义和类的定义不在同一个源文件下。
重新编译的时候
如果声明一个全局数组,例如int a[10], 必须在编译的时候将数组大小确定,这是不是说明,在编译的时候将为此数组分配内存空间????、如果重新编译的话会使客户对象重新生成,那么数组就应该是在编译的时候分配的内存空间对吗?声明一个局部函数内的数组呢??
加入声明的数组带有初始化,即这样int a[10]={0,1,2},那么这些初始化时在运行的时候还是在编译的时候?如果是在运行时,那在编译的时候为什么还要分配内存空间?
同问题一
yangch_nhcmo 2009-05-08
  • 打赏
  • 举报
回复
编译时会去检查语法,生成可执行文件。真正分配内存是在程序运行时。
hjjdebug 2009-05-08
  • 打赏
  • 举报
回复
上面的回答有诸多错误,我搞过简单的编译器,说话是负责的,下面是我的回答。见彩色字。
全局变量和静态全局变量等具有文件作用域的变量在声明后在在编译的时候分配内存空间吗?
答1:全局变量和静态全局变量在编译其间分配内存

还有:如果类的定义改变了,例如增加了数据成员,那么利用这个类的客户,
比方说客户声明了此类的一个对象,这个对象是在重新编译的时候被替换还是在程序运行的时候?
当然类对象的定义和类的定义不在同一个源文件下。
答2:你改变了类定义,用此类的文件都要重新编译,重新生成对象,对象有的是编译期间
分配内存,见答1,有的是运行期间分配内存,如new。至于替换不替换,这种提法不成立。


如果声明一个全局数组,例如int a[10], 必须在编译的时候将数组大小确定,
这是不是说明,在编译的时候将为此数组分配内存空间????、
答3:答1已经回答了

如果重新编译的话会使客户对象重新生成,那么数组就应该是在编译的时候分配的内存空间对吗?
声明一个局部函数内的数组呢??
答4:全局数组参考答1,然后说局部数组。局部数组的大小在编译期确定,但它的位置到运行期才能确定。
局部数组在栈中,由esp通过ebp 来定位, 编译期间,esp,ebp位置还不知道


加入声明的数组带有初始化,即这样int a[10]={0,1,2},那么这些初始化时在运行的时候还是在编译的时候?
如果是在运行时,那在编译的时候为什么还要分配内存空间?
答5. 全局或静态变量在编译时即确定其值,局部变量则是到运行时由代码做初始化,因为局部变量编译时
还不知道esp,ebp在何处, 而全局和静态则知道其变量位置。


好多疑问,请高手不吝指教!
答5. 不客气!
Eric_Jo 2009-05-08
  • 打赏
  • 举报
回复
>>全局变量和静态全局变量等具有文件作用域的变量在声明后在在编译的时候分配内存空间吗?
都是在编译的时候分配内存。

>>还有:如果类的定义改变了,例如增加了数据成员,那么利用这个类的客户,比方说客户声明了此类的一个对象,这个对象是在重新编译的时候被替换还是在程>>序运行的时候?当然类对象的定义和类的定义不在同一个源文件下。
这个要看是如何使用这个类对象的。 如果是定义成全局和静态类对象,就是在编译时候改变。如果定义成类指针或者是局部变量,就是在运行时改变。

>>如果声明一个全局数组,例如int a[10], 必须在编译的时候将数组大小确定,这是不是说明,在编译的时候将为此数组分配内存空间????、如果重新编译>>的话会使客户对象重新生成,那么数组就应该是在编译的时候分配的内存空间对吗?声明一个局部函数内的数组呢??
全局编译时分配,局部是运行时分配

>>加入声明的数组带有初始化,即这样int a[10]={0,1,2},那么这些初始化时在运行的时候还是在编译的时候?如果是在运行时,那在编译的时候为什么还要分>>配内存空间?
编译阶段就初始化好了。
papaofdoudou 2009-05-08
  • 打赏
  • 举报
回复
回复错了,上面是回复的八楼!
papaofdoudou 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 littlechenchen 的回复:]
学习~
[/Quote]回复8喽,呵呵这个我也想过,但是问题是如果这样理解的话,那么重新编译一次代码就会更新旧有的对象又该如何理解呢?如果某个源文件中定义了一个类,另一个文件中声明了这个类的一个对象,当定义类的文件里面修改了类的定义,例如增加了一个数据成员,那么之需要重新编译就可以更新客户文件中的对象,该怎么理解呢??代码就像你说的,在磁盘上,没有运行,但是却更新了客户的对象大小,呵呵!
aaaa3105563 2009-05-08
  • 打赏
  • 举报
回复
帮顶··
机智的呆呆 2009-05-08
  • 打赏
  • 举报
回复
可以认为全局变量和静态变量在编译时就分配好空间了~~~
编译时会把源代码转化成二进制文件 比如obj pe文件等~~相应的全局变量在二进制文件某个节上(ms.data节)
在.data中定义了虚偏移地址,一旦pe文件映射到内存中时 全局变量的虚偏移地址就对应一个虚地址了。
huxuanhui 2009-05-08
  • 打赏
  • 举报
回复
程序 编译后 是放在硬盘上的 你告诉我 怎么给程序分配内存空间??

楼主啊 楼主

服你了
littlechenchen 2009-05-08
  • 打赏
  • 举报
回复
学习~
amossavez 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mengde007 的回复:]
不是在编译时分配空间;而是程序确定了准备分配多少空间,但是没有分配;只有在程序运行时分配;
[/Quote]

对于静态储存区的数据,在编译时就分配了内存地址(相对地址),在程序开始执行时变量就占用内存,直到程序结束时变量才释放内存。
liliangbao 2009-05-08
  • 打赏
  • 举报
回复
你单步调试的时候应该发现没有进入函数前,变量是不分配内存的~
编译只是编译成可执行文件,这当中要检查语法等错误,只有运行时才分配内存,同时这样也合理,节约资源~
ysysbaobei 2009-05-08
  • 打赏
  • 举报
回复
wjksd 2009-05-08
  • 打赏
  • 举报
回复
如果声明一个全局数组,例如int a[10], 必须在编译的时候将数组大小确定,这是不是说明,在编译的时候将为此数组分配内存空间????
因为c++是使用静态类型检查,这个过程是在编译时进行的,所以这里只是一个检查,并没有别的什么,
wjksd 2009-05-08
  • 打赏
  • 举报
回复
编译只是把源代码转换为机器码的过程,在这个过程中有一些语法的检查,错误的语法不能通过编译。
mengde007 2009-05-08
  • 打赏
  • 举报
回复
不是在编译时分配空间;而是程序确定了准备分配多少空间,但是没有分配;只有在程序运行时分配;
pathuang68 2009-05-08
  • 打赏
  • 举报
回复
很多朋友用词不够严谨

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧