C++ 中的类型限定符

来源:互联网 发布:戴墨镜抽烟软件 编辑:程序博客网 时间:2024/05/19 17:03

const 类型修饰的对象在起运行周期内不可被改变.

const全局变量:

       const变量可以是局部的,也可以是全局的。const局部变量除了有不能修改的性质外,其他特性与一般局部变量相同,作用域也相同。const全局变量却不然,一般全局变量的作用域默认是整个程序,但const全局变量的作用域默认是“文件”,即一个const全局变量默认只属于一个文件,不能被其他文件引用。要想被其他文件引用,在定义const全局变量时必须将其声明为extern并初始化,然后在其他引用的文件内也要再extern一次([2]第54页)若在定义时不使用extern,而只在使用到的文件内extern,那么该const全局变量也是不能被其他文件使用的,即使名字相同。

const与指针:

       const与指针有三种关系,分别是:指向const对象的指针const指针指向const对象的const指针
       用得最多的要数指向const对象的指针了,通过这种指针不能随意改变指向的对象,但是没有规定指针指向的对象原本一定要是const的,也可以是non-const的。若该类指针指向的对象原本是non-const的,则该对象可以通过其他途径改变自身值。这里其实可以理解为“该类指针‘自以为是’地指向了const对象而自觉地遵守不改变对象的约定而已”([2]第56页,[3]第111页)。但是注意,指向non-const对象的指针不能指向const对象,因为如果让指向non-const对象的指针指向const对象合法,那样就能通过non-const指针来改变const对象了。如:

[cpp] view plain copy
  1. int i = 8;  
  2. const int ci = 88;  
  3. const int* pc = &i;    //没问题,指向const对象的指针指向non-const对象  
  4. i = 80;                     //没问题,原本为non-const的对象可以通过其他方式改变  
  5. pc = &ci;                   //没问题,指向const对象的指针指向const对象  
  6. int* p = &i;               //没问题,指向non-const对象的指针指向non-const对象  
  7. p = &ci;                    //编译报错,指向non-const对象的指针不能指向const对象  

restrict 限定符修饰的指针意味着所有修改该指针所指向内容的操作全部都是基于该指针的。仅在 C99 标准中增加了这个修饰符。


restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样指向这个内存单元的其他指针都是未定义的,直白点就是无效指针。restrict 的出现是因为 C 语言本身固有的缺陷,C 程序员应当主动地规避这个缺陷,而编译器也会很配合地优化你的代码.

原创粉丝点击