社区
C++ 语言
帖子详情
编译期常量和运行期常量这两个概念如何理解?谁能解答一下,谢谢
jiufeng_z
2007-01-28 10:35:08
在C++编程思想中提到了这两个概念,但是不是很清楚编译器的实现机制,编译器常量是否在编译的时候就可以引用其值?那么它是放在什么内存区的呢?跟运行期常量的区别是什么呢?哪位高手可以给我解疑惑,谢谢!
...全文
823
10
打赏
收藏
编译期常量和运行期常量这两个概念如何理解?谁能解答一下,谢谢
在C++编程思想中提到了这两个概念,但是不是很清楚编译器的实现机制,编译器常量是否在编译的时候就可以引用其值?那么它是放在什么内存区的呢?跟运行期常量的区别是什么呢?哪位高手可以给我解疑惑,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
晨星
2007-01-29
打赏
举报
回复
不是一样的。
对于编译期常量,编译器常常在编译时就可以折叠开。
而对于运行期常量,编译期无法折叠,编译器能做的,只是对所以可能修改它的动做报错。
编译期常量最常见的例子是编译时的常数定义,比如:
const double PI = 3.1415926;
运行期常量的最常见的例子是函数的常量参数(包括常引用,常指针参数)比如:
void f(const string& s) {...}
次常见的例子是类的非静态常量成员。
——这些都是一经初始化,不允许再发生变化的,但其初始值必须到运行时才能知道。
htqx
2007-01-28
打赏
举报
回复
这两个概念有啥作用?
结果都一样就不要想了.
晨星
2007-01-28
打赏
举报
回复
编译期
晨星
2007-01-28
打赏
举报
回复
不完全对,哪些标志符要被放到目标文件的符号表中,跟这个关系不大,哪个主要是看连接性(extern还是static),编译还是调试,等等。
编译时常量也完全可能对应运行时的内存(也可能没有内存,不一定的),但最关键的还是:编译器能否在编译器确定它的值。
jiufeng_z
2007-01-28
打赏
举报
回复
刚刚根据c++编程思想第1卷的第8章的描述,感觉好像是这样的:编译器常量是可以在编译的时候就可以引用的,为什么可以引用是因为在编译的时候那些标示符被放到了符号表中,所以可以直接使用,如果要分配内存的话,那就不行,因为内存的分配是在运行的时候才做的事情,哈哈,应该是这样的,不知道哪位高手可以分析确认一下:)
晨星
2007-01-28
打赏
举报
回复
但问题就在于它的初始值要到编译时才能确定。
——写错了,运行时才能确定。
晨星
2007-01-28
打赏
举报
回复
没什么复杂的。
编译器常量的特点就是:它的值在编译期就可以确定。比如:
const int i = 5;
——再傻的编译器也能在编译时看出它的值是5,不需要到运行时。
在运行时常量,它的值虽然在运行时初始化后不再发生变化,但问题就在于它的初始值要到编译时才能确定。比如:
srand(clock());
const int i = rand();
虽然i的值在定义并初始化成不会再发生变化(除非你使用一些不符合标准的小技巧),但再聪明的编译器也无法在编译时确定它的值呀。
jiufeng_z
2007-01-28
打赏
举报
回复
嗯,按照我的理解:编译器常量就是能在系统还处于编译的时候就可以引用的,而运行期常量
在编译的时候是不能被引用的。但是为什么一个可以被引用,一个不可以被引用,这个背后的机制和原因是什么呢?
jixingzhong
2007-01-28
打赏
举报
回复
需要说明的是,
C++ 中有一个 “常量” 折叠,
导致的结果就是 const int x=128; 类似这样的定义,
产生的结构和 define 一样,
出现 x 的地方直接被 128 这个值代替了~
当然,
这个“折叠优化”是编译器相关的,
也可以设置优化开关 ~
jixingzhong
2007-01-28
打赏
举报
回复
两者都是常量,它们的区别,
可以用是否具备内存空间来区分 ~
编译期常量,
比如, #define MAX 128
这个 MAX 就是编译期常量, 没有对应的内存空间,
在编译时候, 所有的 MAX 都被 128 这个值代替
运行期常量,
比如 const int x=128;
就是一个运行期常量, 分配内存空间,
但是其值不允许改变 ~
Java
编译
期
常量
Java
编译
期
常量
1. 什么是
编译
期
常量
编译
期
常量
,即 compile-time constant。其看似是一个静态,并不一定是由 static 修饰(static 一般只是用于强调只有一份),但强制要求使用 final 进行修饰。
编译
期
常量
完整要求是: declared final;被声明为 final(所有
编译
期
常量
都满足的条件); primitive or String;基本类型或...
在java中,
常量
的定义、
常量
的存储位置、
常量
池
概念
、jvm内存结构、
编译
期
和
运行
期
《Thinking in java》中这个
常量
指的是“在Java 中,这类
常量
必须是原始的 并且以关键字final 表示。在对这个
常量
进行定义的时候,必须对其进行赋值。 一个既是 static 又是final 的域只占有一份不能改变的存储空间。”
编译
期
的值的确定“我们不能因为某数据是 final 的就认为在
编译
期
可以知道它的值。在
运行
期
使用随机生成的数值来初始化类的属性,就说明了这一...
class
常量
池、
运行
时
常量
池 和 字符串
常量
池 的区别
文章目录一、
概念
1、Class
常量
池(Class Constant Pool)1.1、
常量
池中数据项类型2、字符串池(String Pool、String Literal Pool)2.1、参考文章:3、
运行
时
常量
池(Runtime Constant Pool)4、总结二、方法区的class文件信息,class
常量
池和
运行
时
常量
池的三者关系2.1、三者关系图:2.2、方法区class文...
Java之
编译
期
和
运行
期
区别
编译
期
:检查是否有语法错误,如果没有就将其翻译成字节码文件。即.class文件。把源代码转换成(翻译)低级语言的程序。
运行
期
:java虚拟机分配内存,解释执行字节码文件。 从以下代码开始说明,欢迎大家指正 可以思考下,第一行跟第二行在
编译
时
期
有什么区别? java
编译
时会做一些优化操作。第一行,因为是
两个
常量
做运算,那么他们的结果就是确定的,即num1的值是确定的。所以在
编译
时,
编译
器...
深入
理解
Java虚拟机读书笔记-java
编译
期
和
运行
期
优化
编译
期
优化解析和填充符号表1.词法、 语法分析词法分析是将源代码的字符流转变为标记(Token)集合,单个字符是程序编写过程的最小元素,而标记则是
编译
过程的最小元素,关键字、 变量名、 字面量、 运算符都可以成为标记。Token不可再拆分。语法分析是根据Token序列构造抽象语法树的过程,抽象语法树(Abstract SyntaxTree,AST)是一种用来描述程序代码语法结构的树形表示方式,语法...
C++ 语言
64,655
社区成员
250,485
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章