编译期常量和运行期常量这两个概念如何理解?谁能解答一下,谢谢

jiufeng_z 2007-01-28 10:35:08
在C++编程思想中提到了这两个概念,但是不是很清楚编译器的实现机制,编译器常量是否在编译的时候就可以引用其值?那么它是放在什么内存区的呢?跟运行期常量的区别是什么呢?哪位高手可以给我解疑惑,谢谢!
...全文
823 10 打赏 收藏 转发到动态 举报
写回复
用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;
就是一个运行期常量, 分配内存空间,
但是其值不允许改变 ~

64,655

社区成员

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

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