const 理解分析

来源:互联网 发布:tensorflow的windows版 编辑:程序博客网 时间:2024/06/01 17:59

const在C/C++中是一个很重要的关键字,当然也很容易混淆对它的理解。

const-英文意思-常量,它限定了一个变量时不允许被修改,可以产生静态作用,使用const在一定程度上可以提高程序的安全性和可靠性。

在C/C++编译系统中,会严格检查程序编写语法格式,这就使得程序的错误再编译阶段即可发现许多,从而使得出错率大为减少。

在C/C++中,有一种很常见的预处理指令 #define xxx  可以很方便的进行值替代,这种值替代至少在3个方面有点突出,一是避免意义模糊的数字出现,使得程序语意流畅清晰,二是可以很方便的进行参数的调整与修改,只需要在宏定义那修改,整个程序中所有引用该宏定义的地方都随之更改。三是提高了程序的执行效率,由于是使用“预编译器”进行值替代,并不需要为这些常量存储空间,所以执行效率高。鉴于以上有点,预定义指令的使用在程序编程中被广泛使用。

说道这里,可能会迷惑以上这些内容与const有什么关系呢?

预处理语句虽然有上面说的有点,但是它也有缺点,即预处理语句仅仅只是简单的值替代,缺乏“类型”检测机制,这样预处理语句就不能享受编译系统的类型检查好处了,从而可能成为引发一系列错误的隐患,比如在程序中,定义一个只读变量“u8 name[]=“tom”,在编程中如果对name[1]进行赋值,可能就会引起一系列的错误。

所以,const的推出的初始目的,正是为了取代预编译指令,消除它的缺点,同事继承它的优点。

const作用及优点:

1.以const修饰的常量值,具有不可变性,这是它能取代预定义语句的基础。

2.很明显,它也同样可以避免意义模糊的数字出现,可以很方便的进行参数的调整和修改。

3.C/C++编译器通常不会为const变量分配RAM存储空间,而是将他们保存在符号表中,这就使得它成为了一个编译期间的常量,没有了存储与读内存操作,使得它的效率很高,同时,这也是它取代预定义的重要基础,编译器在编译它时,不会去读存储的内容,而是直接从符号表中替代。这是一种特别特别特别好的优点,比如在存放字库或者图片库时,这些库的对应的数组体积会特别大。

举例-假如一个16位真彩色的宽320,高240的图片pic,那么这张图片占用的字节数为nBytes:

nBytes = 320*240*2 = 153600 (每个像素16位-2个字节)

如果定义一个数组变量 unsigned char pic[153600],那在编译时,会报错,如下:

       Error: L6406E: No space in execution regions with .ANY selector matching lcd.o(.bss).
很明显,这样一个庞大的数组,是不能定义成一个全局变量的。而如果是const,则完美的解决了这一问题。

另外,const定义也像一个普通的变量定义一样,它会有编译器对它进行类型的检测,消除了预定义语句的隐患。

const 使用:

其实const只是给编译器看的,真正在使用时,只要是对它“只读”不要写,就可以了。包括const 指针也是,可以在函数内部直接定义 const u8 *p ;

p = &pic[i];   这也是合法的。


原创粉丝点击