关于const的问题

在一本书上看到下面的讲解,然后在VS2008下调试了一下,发现在const int N=100;这条语句时,有内存分配发生,并不是作者所说的那样,请问这是与编译器相关的吗?
分配不分配看编译器实现者的心情。
一般要取N的地址时,可能必须要分配内存了。
作者在讲解const与define的对比时,提到了const的一个特点是:节省空间,避免不必要的内存分配,同时提高效率。作者指出,编译器通常不为普通const只读变量分配内存存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。然后就举了上面的例子。
作者的意思是:const变量在内存中只有一份拷贝;而宏定义可能存在若干个拷贝。
谢谢,如果VS是这样实现的,好像就不存在作者所说的,“这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。”

LZ,你试试将const int N = 100;放到main()函数之外,再看看汇编是不是有所变化呢!
同时,0042D625 mov dword ptr [a],64h 这一句不正是直接用100来替换N的吗?

另外,作者对于const与define的比较说明实在不敢苟同,怎么会扯到内存分配、提高效率这个上面来呢?建议别再看这样的书了!
实际上一般我们说用const替换define的真正含义是“用编译器来替换预处理器,以解决强数据类型的要求”,也就是说用编译器来检查数据类型是否匹配,以避免预处理器因数据类型问题而带来的副作用。

尽信书则不如无书,直观的理解看,你这个int a=N没有任何理由要求N有存储空间,在编译期间把N的值直接替换成立即数没有任何问题。我怀疑要么书写错了,要么你没理解书

在我看来,任何试图获得常量地址的行为都是不合理的。既然是常量,你就不可能去修改它,你取他地址又什么用

哎,有些书真是害人不浅。
楼主如果懂汇编的话,就知道了
0042D61E mov dword ptr [N],64h 
这句汇编表明N已经在内存里分配了。

如果const是全局常量的话,一般的编译器会将其当作编译期常量,(预处理)编译时的时候就全部被直接用其值替换了。

书上的作者在谈到const的特点时,提到了一个优点:“节省空间,避免不必要的内存分配,同时提高效率”。
我的疑问是:
当const变量是全局的时候,VS编译器没有为其分配存储空间,即像17L所言,把当做立即数进行替换。
但是,当声明const变量为局部变量的时候,VS编译器是为其分配了空间的。这样的话,所提的const的这个“优点”是不是特指的全局变量的时候呢。
我只是想验证一下作者的提法是否正确,并无其他意思。
下面摘自原文:
const定义的只读变量从汇编的角度来看,只是给出了对应的内存地址(好像不是这样,VS下全局和局部的时候都是用立即数直接赋值的,并没有出现内存地址呀),而不是像#define一样给出的是立即数,所以,const定义的只读变量在程序运行过程中只有一份拷贝,而#define定义的宏常量在内存中有若干个拷贝。#define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。#define宏没有类型,而const修饰的只读变量具有特定的类型。

您的意思是在D模式下代码没有进行优化,所以讨论这个没有意义吗。那该如何测试呢?

热水器上的温度显示、电子表上的数字时钟这些也是界面显示。先用C熟练显示这些比在PC上显示WIN窗口有意义的多。要知道,WIN窗口仅是这二十年内的事情,也仅仅代表了部分程序设计的界面显示。并不是所有程序员要求会画WIN窗口的。

来源:足球直播

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值