运行期常量与编译期常量的通俗理解

LogicCraftPro
• 阅读 6324

常量不用解释。

简单说下什么是编译期,什么时运行期

编译期是编译器将你写的代码和资源文件链接编译成可执行文件的这一过程。

运行期是运行前面编译期生成的可执行文件的过程。

以C++为例
下面解释运行期常量和编译期常量

运行期常量(const修饰)从一开始就存在,而编译期常量(constexpr修饰)在C++11标准之后才加入。

const修饰的运行期常量,会在运行编译完成后的代码时,先在内存的常量区域开辟空间存放常量的值,以确保常量值不可变,保证程序的正确性。

而现实中存在一些情况,例如1+2的值恒定不变,或者某个函数在某种情况下的返回值可以由程序员人为确定,并确保程序可以正确运行,而不需要通过存放到内存上的常量区域来保证,这就为代码的优化提供了可能。

编译期常量是由编译器在编译时通过计算来确定常量的值,然后在代码中直接进行替换,类似于 #define MAX 5 在编译时将代码中所有的MAX替换成5一样,就不需要在后面的运行时再在内存上开辟空间存放常量,以达到优化的效果。

点赞
收藏
评论区
推荐文章
小万哥 小万哥
1年前
掌握 C++ 编译过程:面试中常见问题解析
C编译过程C是一种高级编程语言,但是计算机并不能直接理解它。因此,需要将C代码翻译成计算机可以理解的机器语言。这个过程就是编译过程,是C程序从源代码到可执行文件的转换过程,包括预处理、编译、汇编和链接四个阶段。1.预处理在编译器开始编译之前
晴空闲云 晴空闲云
3年前
javascript实践教程-04-常量
本节目标1.掌握声明常量的应用场景。2.掌握常量的定义和使用。3.阅读时间大约510分钟。内容摘要本篇讲解了常量和变量的区别,讲解了常量的声明和使用,常量的命名规则,并列举了相关例子。阅读时间510分钟。为什么要用常量前面我们学习了变量,但是变量在运行过程中是可以变化的。在现实生活中,有一些数据是不会变化的,比如:数学上的PI、自然常数e等等,这些
Wesley13 Wesley13
3年前
java 源码编译
Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(叫“编译器的前段”更准确)——把\.java文件转变成\.class文件的过程;也可能是虚拟机的后端运行期编译器(JIT)把字节码转变成机器码的过程;还可能是指静态提前编译器(AOT编译器)直接把\.java文件编译成本地机器码的过程。Javac编译器
Wesley13 Wesley13
3年前
Java中static、final、static final的区别
说明:不一定准确,但是最快理解。final:final可以修饰:属性,方法,类,局部变量(方法中的变量)final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值。final修饰的属性表明是一个常数(创建后不能被修改)。
Wesley13 Wesley13
3年前
go语言学习
iotaiota,特殊常量,可以认为是一个可以被编译器修改的常量。iota在const关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。iota可以被用作枚举值:const(a
Stella981 Stella981
3年前
Android 常见问题之Assets文件大小限制
Android(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Flib.csdn.net%2Fbase%2F15)中有个很恶心的潜规则,就是当assets或是raw目录下单个压缩文件大小超过1024K之后,编译期appt会去强行处理此文件,使得我们运行期读取的时候会收到一个This
Wesley13 Wesley13
3年前
Java基础知识拾遗、类加载机制
  注意:刚学java不要用ide!!!!!!!!!!不然学几个月,连关键字都不会写!!!!!!!!!!!  直接量:程序通过源代码直接给出的值,只包括基本数据类型,String,null类型,inta5;5就是直接量。  当程序第一次使用某个字符串直接量时,会使用常量池缓存该字符串直接量。  常量池:在编译期被确定,并被保存在已编译的.cl
Wesley13 Wesley13
3年前
go基础语法
1.常量定义用const关键字修饰常量名并赋值,常量命名不同于java等语言,golang中一般用小写,因为在golang中首字母大写表示public权限consta32.常量使用使用数值常量进行运算时不需要进行强制类型转换,编译器会自动识别consta,b3,4va
Stella981 Stella981
3年前
Effective Objective
对象的类型并非在编译期就绑定好了,而是要在运行期查找。而且还有个特殊的类型叫做id,它能指代任意的ObjectiveC对象类型。一般情况下,应指明消息接收者的具体类型,这样的话,如果向其发送了无法解读的消息,那么编译器就会产生警告信息。而类型为id的对象则不然,编译器假定它能响应所有消息。如下面代码所示:!(https://os
Wesley13 Wesley13
3年前
JAVA字节码执行引擎总结
字节码指令大部分操作指令都有对应不同类型的不同指令,比如iloadistoreireturn表示加载(整形变量进操作数栈)、定义一个整形局部变量、返回一个int类型值return11》iconst2;ireturn编译期优化:直接将11定义为常量2运行时就不用再做计算了这段代码操作数栈的最大深度是2
Wesley13 Wesley13
3年前
Java 基础语法
常量:在程序运行期间,固定不变的量常量的分类:1.字符串常量:凡是用双引号引起来的部分,叫做字符串常量,例如:"abc","hello","123"2.整数常量:直接写上的数字,没有小数点,例如:100,200,0,2503.浮点数常量:直接写上的数字,有小数点,
LogicCraftPro
LogicCraftPro
Lv1
远书归梦两悠悠,只有空床敌素秋。
文章
5
粉丝
0
获赞
0