打印

const的用法

[复制链接]
1700|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
醉心369|  楼主 | 2013-7-20 15:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.const修饰只读变量,具有不变性
      #include <stdio.h>

       int main()
      {
            const int Max = 100;
             int Array[Max];
   
              return 1;
       }
     在VC6.0中创建.c该文件,编译器会报错。因为我们定义数组必须指定其元素的个数,这也从侧面证实C语言中,const修饰的Max仍然是一个变量,只不过是只读属性罢了。
     const修饰的只读变量必须在定义的同时初始化
2.节省空间,避免不必要的内存分配,同时提高效率
    const推出的初始目的,是为了取代预编译指令,消除它的缺点,同时继承他的优点。可以看下他和define的区别
    编译器通常不为普通const只读变量分配存储空间,而是将他们保存在符号表中,这使他成为一个编译期间的值,没有了存储于读内存的操作,使得他的效率也提高
    #include <stdio.h>

    #define M 3               //宏常量
   
   const int N = 5;          //此时并未将N放入内存中
   int main()
{
       int i = N;                  //此时为N分配内存 ,以后不再分配
       int I = M;                 //预编译期间进行宏替换,分配内存
       int j = N;                  //没有内存分配
      int J = M;                  //在进行宏替换,又一次分配内存
}
const定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的只读变量在程序运行过程中只有一份备份(因为它是全局的只读变量,放在静态区),而#define定义的宏常量在内存中有若干个备份。#define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。#define宏没有类型,而const修饰的只读变量具有特定的类型。

从网上看到这段话,对于2《节省空间,避免不必要的内存分配,同时提高效率》,不是十分理解,请大侠们解读一下

相关帖子

沙发
airwill| | 2013-7-20 15:30 | 只看该作者
《节省空间,避免不必要的内存分配,同时提高效率》,通常很多编译器会将 const  变量放到 ROM 中, 从而节省了相对紧张的 SRAM 空间.

使用特权

评论回复
板凳
醉心369|  楼主 | 2013-7-20 16:08 | 只看该作者
airwill 发表于 2013-7-20 15:30
《节省空间,避免不必要的内存分配,同时提高效率》,通常很多编译器会将 const  变量放到 ROM 中, 从而节 ...

那你的意思是与code的作用是一样的?

使用特权

评论回复
地板
airwill| | 2013-7-20 16:29 | 只看该作者
code 只在 C51 里有用. 跟 const 编译结果是一样的.
const 则在各编译器都支持.

使用特权

评论回复
5
醉心369|  楼主 | 2013-7-22 10:59 | 只看该作者
airwill 发表于 2013-7-20 16:29
code 只在 C51 里有用. 跟 const 编译结果是一样的.
const 则在各编译器都支持.

那可以提高效率吗,文中说是保存到符号列表中。
const int N=5; //此时并未将N 放入内存中
这句话应该分配内存吧?

使用特权

评论回复
6
airwill| | 2013-7-22 11:12 | 只看该作者
const int N=5;     // 编译器将N 放入ROM 中

通常很多编译器会将 const  变量放到 ROM 中, 从而节省了相对紧张的 SRAM 空间.

使用特权

评论回复
7
醉心369|  楼主 | 2013-7-22 11:23 | 只看该作者
airwill 发表于 2013-7-22 11:12
const int N=5;     // 编译器将N 放入ROM 中

通常很多编译器会将 const  变量放到 ROM 中, 从而节省了相 ...

刚才我把我的项目程序修改了一下,测试了一下const。测试环境是keil3。
int a[]={0x12,0x34};编译的代码大小为:data=57.1,code=6238;
int const a[]={0x12,0x34};编译的代码大小为:data=57.1,code=6238;
int code a[]={0x12,0x34};编译的代码大小为:data=55.1,code=6128;
从验证来看,conse与code是不一样的,为什么会出现上面的情况?

使用特权

评论回复
8
airwill| | 2013-7-22 11:42 | 只看该作者
本帖最后由 airwill 于 2013-7-22 12:06 编辑

int const a[]={0x12,0x34}; 变成
const int a[]={0x12,0x34}; 呢?

如果是一样的, 那看样子keil  C51 没有把const 变量放到 rom 里去.

使用特权

评论回复
评论
醉心369 2013-7-22 11:49 回复TA
试了试,他们是一样的 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

283

帖子

2

粉丝