<高质量C>C语言基础和变量(二)

来源:互联网 发布:荣耀盒子 软件安装 编辑:程序博客网 时间:2024/05/28 20:19

              接上篇cache命中率,因为CACHE的容量远远小于内存,它只可能存放内存的一部分数据。CPU自然是先访问CACHE,再访问主存,如果数据在CACHE中为命中,在不在内存中为不命中,这就有个比例问题,这个比例就是命中率。如是按照列行索引数组,经常跨存储页,由于CACHE容量小,cache中的内容只能保存有限页,所以命中率就会降低,导致索引效率降低。

          下面说说,C语言的常量。

           常量分为字面常量(直接出现的字符,字符串,各种进制的数等),符号常量(#define和const定义的常量),契约型常量,枚举常量。

          字面常量只能引用不能修改,除了字符串外,无法去一个字面常量的地址,如 int *p=&5;就是错误的。同时通过字符串地址修改其中字符也是错误的,如 char *p="abc";   *(p+2)='k';就是错误的。字面常量一般保存在符号表里。

          符号变量中,由于#define在编译时就被替换,所以本质上就是字面常量。const,即不能修改的变量,在C语言中,会给const变量分配存储空间(外连接),同时对于基本类型的const变量,编译器会在内存中创建拷贝,所以通过该变量地址修改的值是无效的,只能做到修改拷贝值,而不是const变量的值。

           const与define的比较,const定义的常量有类型,所以会经过静态类型安全检查机制,有的ide支持const类型的的调试。

          定义常量的集中方法:

          方法一:在公用头文件中定义static并初始化

                           static const int  max_length=1024;

          方法二:在公用头文件中声明为extern ,

                         extern const int max_length;

                          并在源文件中定义。

                        const int max_length=1024;

          方法三:如果是整型常量,在公用头文件中定义 enum类型。

          方法一与方法二的比较:

                  方法一:方便维护。但是每个包含它的文件都会生成一份拷贝,同时后面初始化的字面常量也会生成拷贝,浪费空间。

                  方法二:影响小,改变一个值只需要重新编译该源文件,节约存储。缺点是需要修改源文件。

           到底用哪种方法完全就是看项目要求了。

          这几种方法在C与C++中有者本质的区别,主要原因是C中extern是外连接,而在C++中是内连接。

          下面补充static的用法(C语言):

          1.static用于变量,分配在静态存储区, 在程序整个运行期间都不释放。并且初始化只有一次。

          2.static用于函数,是为了限制函数的作用域在所在文件中,这样的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其               它文件中的函数同名。

0 0