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

编译期与运行期 看这样一段代码。 #include using namespace std;class A{public: virtual void f(){cout<<"A"<<endl;}};class B:public A{private: void f(){cout<<"B"<<endl;}};int main(){ A* pA = ne 阅读详情

转自http://topic.youkuaiyun.com/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产生的东西,编译器不知道它什么时候被摧毁,所以要在运行期分配。  
   
  编译器分配的存贮单元的位置也是知道的,这个说的是相对位置,加载到内存以后的位置是基地址+偏移位置,基地址要根据不同的编译器确立,而偏移位置在编译的时候就就确定了(不同编译器的标准也不一样,有的时候有的变量还会被编译器优化得无影无踪)。

java编译和运行期都干了什么事情 前置情景: 前几天写代码,发现controller中的cathch Exception并catch不住,而是直接走进finally里面,最终异常抛到spring里面了。此生未遇到。 查了下文档解释是在通过反射调用的时候,如Method.invoke(),如果被反射执行的方法体抛出了Exception,这个异常会被包装成InvocationTargetException重新抛出。 很不幸,我的ma... 阅读详情

相关推荐

RabbitMQ的使用(JAVA)

Java快速上手的MQ上线!

.............. 1万+

编译期和运行期

编译期:检查是否有语法错误,如果没有就将其翻译成字节码文件。即.class文件。把源代码转换成(翻译)低级语言的程序。 运行期:java虚拟机分配内存,解释执行字节码文件。 编译是将你写的代码弄成Java虚拟机可以执行的字节码。运行是Java虚拟机运行你写的代码(编译后的字节码文件),然后显示运行结果。 Java代码是为了编程方便,而Java虚拟机是不能直接执行Java代码的,所以要把Java代码编译,也就是生成.class文件,然后再由Java虚拟机运行字节码文件,结果才是你写的程序。 一...

codedot 1568

避坑指南:Qt无边框窗口拖动+阴影效果这些细节要注意

本文深入探讨了Qt无边框窗口开发中实现流畅拖动与阴影效果的关键细节与常见陷阱。针对高DPI屏幕适配、阴影闪烁、拖动卡顿及多显示器兼容性等核心难题,提供了从QGraphicsDropShadowEffect原理剖析到手动绘制优化、坐标系统精准处理及平台原生事件拦截的实战解决方案,帮助开发者构建稳定、美观的商业级应用界面。

weixin_27943395的博客 479

编译期和运行期知识点

之前对于编译期和运行期的理解都停留于书面,只是浅显的知道多态发生于运行期之类的知识点,现在上网查找下相关资料,做下知识点汇总 1 编译系统 在Unix系统上,从源文件到可执行文件,是由编译器驱动程序完成的。对于GCC编译器驱动程序来编译hello.c源文件,首先读取源程序文件,然后把它翻译成可执行文件hello。这个翻译过程由四个阶段完成: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B9fGaUB3-1651916251981)(C:\Users\PrinceAlLHH\

Yohuna的博客 1165

STC8H8K64U ADC采样实战:从蜂鸣器控制到电压测量(附完整代码)

本文以STC8H8K64U单片机为核心,通过两个实战案例详细讲解ADC采样的应用。首先介绍如何利用ADC采样值动态控制蜂鸣器响度,实现模拟PWM效果;其次深入探讨高精度外部电压测量的方法,包括硬件连接、两点校准技巧以及软件滤波,旨在帮助开发者从理论到实践全面掌握ADC功能。

weixin_29159441的博客 562

ICCV 2025 | 哈工大、清华等提出首个双曲学习框架:HLFormer,革新局部相关视频检索

离原点越远,代表的语义越具体(部分)。现有方法大多在传统的欧几里得空间中对视频和文本进行建模,但这往往会导致对视频内在层次结构的错误表示,从而影响检索的准确性。通过UMAP对学习到的帧嵌入进行可视化(如下图),可以观察到,来自同一时刻的视频帧在嵌入空间中聚集在一起,清晰地展示了模型对时序关系的捕捉能力。下图的双曲空间可视化进一步证实了模型的层次建模能力:离原点越近的点,代表的语义层级越高、粒度越粗糙,反之亦然。:既然文本查询描述的是视频的一部分,那么在几何表示上,文本的嵌入向量应该从属于视频的嵌入向量。

我爱计算机视觉 1082

java基础2_编译期和运行期

有3个概念: 编译时 运行时 构建时 理解这3个概念可以很好的帮助我们去理解一些基本的概念。   方法重载 -&gt; 编译期,编译时多态,根据参数类型,决定生成调用哪个方法的字节码 方法覆盖  -&gt; 运行期,   运行时多态,   根据对象的类型, 决定调用哪个实例方法 继承        -&gt; 编译期,因为是静态的。 泛型(又称类型检验)-&gt; 发生...

ljk12111217的博客 192

ESP32 DW1000 UWB 室内定位系统

详细介绍ESP32 DW1000 UWB 室内定位系统的设计演示demo。

DT程序员的博客 1662

区分 C++ 编译期与运行期:一篇就够了

编译期是指从你编写的 C++ 源代码 (.cpp, .h 文件) 开始,到编译器将其转换为可执行的机器代码(例如 Windows下的.exe 文件或 Linux/macOS 下的可执行二进制文件)为止的整个过程。将源代码分解成一个个独立的词法单元 (tokens),如关键字 (int, class)、标识符 (myVariable)、操作符 (+, =)、字面量 (123, “hello”) 等。由编译器生成的可执行机器代码,以及程序运行时需要的外部数据(如用户输入、文件内容、网络数据)。

CppPlayer 1395

【异常】Antigravity IDE 登录异常与网络连接错误排查指南

在使用 Google 推出的 AI 原生 IDE时,部分用户可能会遇到身份验证失效与网络环境冲突导致的叠加错误。本文将针对此类典型故障提供完整的解决思路。

奶爸的编程之路,也就一周冷个三天 1718

python实现边缘检测Canny算子 (附完整源码)

python实现边缘检测Canny算子 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 457

JAVA之编译期和运行期区别

qq_43842093的博客 2113

数学向量空间的对偶空间解析

对偶空间是线性代数的"进阶语法",它不仅深化了我们对向量空间的理解,还为解决实际问题提供了强大工具。用生活类比解释对偶空间的核心概念,打破"抽象数学"的壁垒;建立对偶空间与原向量空间的直观联系,揭示"对偶"的本质;通过数学推导和代码实现,让读者掌握对偶空间的基本运算;展示对偶空间在科学和工程中的应用,体现其理论价值。范围:本文从有限维实向量空间入手(便于理解),逐步扩展到对偶基、双对偶空间,最后简要提及无限维空间的特殊性。

AI天才研究院 880

编译期异常和运行期异常的区别

编译期异常和运行期异常的区别 A:编译期异常和运行期异常的区别 Java中的异常被分为两大类:编译时异常和运行时异常。 所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常 * 编译时异常 * Java程序必须显示处理,否则程序就会发生错误,无法通过编译 * 运行时异常 * 无需显示处理,也可以和编译时异常一样处理 ...

LeoZuosj的博客 3622

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

c++ 编译期与运行期 总结

一 见识编译期的力量 #include     using namespace std;    class A{    public:        virtual void f(){cout };    class B:public A    {    private:        void f(){cout };    int main()    {

cjbbx的专栏 869

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

深入理解JVM - 编译期/运行期优化

----------------------------编译期优化-------------------------------------- 1、概述(编译期) Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(Javac编译器)把Java文件转变为class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器)把字节码转变为机器码的过程;还可能是

json_it的博客 1543

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

c++ 编译期与运行期总结

一 见识编译期的力量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include "stdafx.h" #inclu

程序猿的视界 6757

多态性之编译期多态和运行期多态(JAVA版)

编译期多态和运行期多态(JAVA版)     上一篇讲述了C++中的多态性,由于多态性是面向对象编程中常用的特性,所以JAVA作为面向对象的主流语言自然也有多态性,它的多态性其实和C++的概念差不多,只是实现形式和表现形式不一样。在C++中可能还会提到多态的划分,但是在JAVA中可能很多人都不会听到编译期多态和运行期多态这种划分,一般我们说到多态都是指运行期多态,因为这才是面向对象思想的

君临天下的博客 3030

Java之编译期和运行期区别

编译期:检查是否有语法错误,如果没有就将其翻译成字节码文件。即.class文件。把源代码转换成(翻译)低级语言的程序。 运行期:java虚拟机分配内存,解释执行字节码文件。 从以下代码开始说明,欢迎大家指正 可以思考下,第一行跟第二行在编译时期有什么区别? java编译时会做一些优化操作。第一行,因为是两个常量做运算,那么他们的结果就是确定的,即num1的值是确定的。所以在编译时,编译器...

AlbenXie的博客 2426

关于编译期和运行期一些理解

从宏观上来讲,编译期是指把你的源程序交给编译期编译的过程,最终的目的是得到可执行的文件。运行期指的是你将可执行文件交给操作系统执行,直到程序执行结束的期间,执行的目的是为了实现程序的功能。 Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程。 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1、源文件由编译器编译成字节码(ByteCode) 2、字

Megustas_JJC的博客 1224

编译期和运行期的区别

不知大家有没有思考过,当我们使用IDE写了一个Demo类,并执行main函数打印 hello world时都经历了哪些流程么? 想通过这篇文章来分析分析Java的执行流程,或者换句话说想聊聊Java的编译期与运行期的流程。 开门见山 编译期间都做了什么 运行期间都做了什么 开门见山 public class MyApp { public static void main(String[] args) { System.out.println(“hello world”); } } 假如我们写了一

Object_02的博客 723

JAVA学习之编译期和运行期区别

编译期:检查是否有语法错误,如果没有就将其翻译成字节码文件。即.class文件。 运行期:java虚拟机分配内存,解释执行字节码文件。 从以下代码开始说明,欢迎大家指正 可以思考下,第一行跟第二行在编译时期有什么区别? java编译时会做一些优化操作。第一行,因为是两个常量做运算,那么他们的结果就是确定的,即num1的值是确定的。所以在编译时,编译器就会直接算出num1的值。第二行则...

爱科比的博客 387

C++ constexpr 函数:编译期与运行期的优雅统一

许多 C++ 开发者初次接触 `constexpr` 时,都会产生一个根深蒂固的误解:认为 `constexpr` 就是"编译期常量"的代名词。这种理解就像柏拉图的洞穴寓言中那些只看到影子的囚徒,他们把影子当作了事物的全部真相。实际上,`constexpr` 的设计远比这个表面理解要深刻和灵活得多。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1545

Java编译期与运行期

编译期:是指把源码交给编译器编译成计算机可以执行的文件的过程。在Java中也就是把Java代码编成class文件的过程.编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作,比如检查错误。 运行期:是把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来,在Java中把磁盘中的代码放到内存中就是类加载过程,类加...

111
上一篇: 好的网站
下一篇: 内联函数学习总结
SearchLife
博客等级 码龄20年 51粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值