The different between #define and const for a constant in C

本文探讨了C/C++中const与#define定义常量的区别。通过具体的代码示例展示了两者在内存分配上的不同,const常量在堆栈分配空间,而#define直接替换为常数值。此外还分析了它们在运行时和编译时的不同表现及适用场景。

这应该算一个经常争论的话题,而且往往没有个结果。

虽然他们在使用中感觉“差不多”,但是他们在实现上有什么区别?

请看下面的代码:

3:    #define T 13 /*用#define定义的一个常量T*/

4:

5:    int main()

6:    {

00401000   push        ebp

00401001   mov         ebp,esp

00401003   sub         esp,4Ch

00401006   push        ebx

00401007   push        esi

00401008   push        edi

00401009   lea         edi,[ebp-4Ch]

0040100C   mov         ecx,13h

00401011   mov         eax,0CCCCCCCCh

00401016   rep stos    dword ptr [edi] /*以上均是初始化(这个词不太准确,在我没有想到更好的之前先用他吧^_^)操作,不管他。*/

7:

8:        const int t=13;/*用const定义的一个常量*/

00401018   mov         dword ptr [ebp-4],0Dh /*const常量t在堆栈中分配了一块空间保存其值0xD=13*/

9:

10:       int n=t;/*把t赋值给n*/

0040101C   movsx       eax,dword ptr [ebp-4] /*把储存在堆栈中的const常量t取出,传递到eax*/

00401020   mov         dword ptr [ebp-8],eax /*把eax的值赋给变量t([edp-8]是t的空间的起始地址,又是4 dword,VC就是粗犷啊:P)*/

11:       int m=T;/*把T赋值给m*/

00401023   mov         dword ptr [ebp-0Ch],0Dh /*把0xD(13)赋值到变量m([edp-0Ch]是他的起始空间)*/

[以上代码来自VC++ 6.0]

从上面这段代码可以看出,const与#define最大的差别在于:前者在堆栈分配了空间,而后者只是把具体数值直接传递到目标变量罢了。或者说,const的常量是一个Run-Time的概念,他在程序中确确实实的存在可以被调用、传递。而#define常量则是一个Compile-Time概念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。

const常量存在于程序的数据段,#define常量存在于程序的代码段。

至于两者的优缺点,要看具体的情况了。一般的常数应用,我个人认为#define是一个更好的选择:

i.从run-time的角度来看,他在空间上和时间上都有很好优势。

ii.从compile-time的角度来看,类似m=t*10的代码不会被编译器优化,t*10的操作需要在run-time执行。而#define的常量会被合并(在上例中T*10将被0x82取代)。

但是:如果你需要粗鲁的修改常数的值,那就的使用const了,因为后者在程序中没有实际的存在。(其实应该说修改数据段比代码段要简单^_^)。

http://kaby.blogdriver.com/kaby/171539.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值