如何理解编译期和运行期的概念?它们分别干了什么

来源:互联网 发布:窃听软件手机版 编辑:程序博客网 时间:2024/04/30 03:00

转自http://topic.csdn.net/t/20040727/17/3215711.html

 

如何理解编译期和运行期的概念?它们分别干了什么

楼主cathy97(男人练瑜伽好处多)2004-07-27 17:29:46 在 C/C++ / C++ 语言 提问

一直搞不清二者的实际区别,经常在一些文档里说,编译期分配内存,或在运行期分配内存,编译期错误,运行期错误。如何区分他们,请各位指点哟 问题点数:50、回复次数:11Top

1 楼whyglinux(山青水秀)回复于 2004-07-27 17:44:10 得分 5

编译期是指把你的源程序交给编译器编译的过程,最终目的是得到可执行的文件。运行期指的是你将可执行文件交给操作系统(输入文件名,回车)执行、直到程序执行结束的期间,执行的目的是为了实现程序的功能。Top

2 楼zjxiaoyu(alalei)回复于 2004-07-27 18:04:54 得分 5

编译期分配内存,就是用静态或全局数组。这是在编译的时候确定的。  
  运行期分配内存,就是用malloc()之类的函数,在堆上分配内存。  
  编译期内存错误,就是比如某个数据段DATA段或者CODE段等等,超过跑这个程序的目标机的存储器的限制。比如DOS下,DATA段不能超过64K吧。  
  运行期内存错误,就是运行的时候发生的,比如申请不到内存,内存越界访问,等等。Top

3 楼geesun(还是Geesun!)回复于 2004-07-27 18:07:58 得分 10

上面说的已经很清楚了~  
  比如:  
  char   str[LENGTH]   //这个LENGTH你必须在编译期就能知道他的大小,所以只能是宏定义和const(const   int   LENGTH=100,这个是在编译期间就把100和LENGTH邦定的,以后不能更改的!),这个是在编译期   就能知道的量。  
   
  如果你用int   LENGTH   =100;那这个东西是在运行期间才知道LENGTH的值(运行的时候才把100赋给LENGTH),所以会出现错误!Top

4 楼antijpn(antijpn)回复于 2004-07-27 18:11:23 得分 20

编译期确切地说应该是得到obj文件的过程,得到最后可执行文件的过程叫链接  
   
  编译期最前,最后的是运行期。  
  编译期错误是编译期间就能被编译器捕捉到的错误,譬如定义一个过大数组,不过最常见的还是语法错误或者拼写错误。运行期错误可以也可以是分配一个过大的数组,不过在C++里面这个可以因为new[]或者malloc产生,C里面一般由malloc产生。运行期错误还有表达式中的被0除、越界访问等。  
   
  编译期分配内存并不是说在编译期就把程序所需要的空间在内存里面分配好,而是说在程序生成的代码里面产生一些指令,由这些指令控制程序在运行的时候把内存分配好。不过分配的大小在编译的时候就是知道的,并且这些存贮单元的位置也是知道的。  
  而运行期分配内存则是说在运行期确定分配的大小,存放的位置也是在运行期才知道的。Top

5 楼bluejugar(2046,那年我64.)回复于 2004-07-27 22:09:06 得分 0

轻轻的顶一下,悄悄的离开。Top

6 楼elvahuang(熊熊)回复于 2004-07-27 23:50:55 得分 5

编译简单点说就是将source   code-->汇编语言或。NET中的IL或二进制文件  
  运行就是CPU执行上述编译后的代码Top

7 楼cathy97(男人练瑜伽好处多)回复于 2004-07-28 14:52:31 得分 0

感谢各位的帮助,antjipn所言,  
   
  编译期分配内存并不是说在编译期就把程序所需要的空间在内存里面分配好,而是说在程序生成的代码里面产生一些指令,由这些指令控制程序在运行的时候把内存分配好。不过分配的大小在编译的时候就是知道的,并且这些存贮单元的位置也是知道的。  
   
  问题:  
  1。对于new,也可以指定其分配空间的大小,如int   a   =   new   int[100],那为何编译器不能分配空间,而非要等到运行期才能分配呢?  
  2。编译器分配的存储单元的位置也是知道的,如何理解?我想这个地址应该是虚地址,当程序运行时被加载到内存后,还要映射到真正的物理地址吧。  
   
  另外,请教各位有没有这方面的书可以参考,是不是非要看“编译原理”之类的书,太恐怖了Top

8 楼expert2000(ZLX)回复于 2004-07-28 14:56:06 得分 0

个人认为,编译期的错误一般都是语法错误,运行期的错误都是逻辑错误。(可能以偏概全了^!^)Top

9 楼king1(bobo)回复于 2004-07-28 16:01:12 得分 5

编译期就是指把源程序转换为可执行文件的过程,其错误大部分是语法错误,而运行期错误就是指由于程序本身的逻辑原因,产生一些非法操作所致的错误  
  至于那些细节是在编译原理里讲Top

10 楼cathy97(男人练瑜伽好处多)回复于 2004-07-28 16:44:47 得分 0

看来真的要看编译原理了,那书理论性太强,有没有相关的文档,请大家推荐。。。。Top

11 楼antijpn(antijpn)回复于 2004-07-28 21:13:48 得分 0

回复人:   cathy97(肉沫茄子)  
  能不能不把我的名字打错?  
  new/new[]其实还是调用了函数,Inside   the   C++   Object   Model里面说的是__new(),不过我估计还是调用了malloc()的,难道编译期就能调用函数,C/C++里面都没这个特性。而且作为由程序员控制生命周期的东西,你能要求编译器负责清除它吗?而清栈的过程是由编译器负责的,不用程序员负责,只要到了一个块结束的时候就调用destructor,到了函数结束的时候就弹出栈。而new产生的东西,编译器不知道它什么时候被摧毁,所以要在运行期分配。  
   
  编译器分配的存贮单元的位置也是知道的,这个说的是相对位置,加载到内存以后的位置是基地址+偏移位置,基地址要根据不同的编译器确立,而偏移位置在编译的时候就就确定了(不同编译器的标准也不一样,有的时候有的变量还会被编译器优化得无影无踪)。