其他分享
首页 > 其他分享> > C限定符

C限定符

作者:互联网

const

用const关键字声明的变量,其值不能通过赋值或递增、递减来修改。

const变量只能声明同时初始化。

    float val = 10;
    const float * pf;  // pf 指向一个float类型的const值,可以指向其他值,但不能通过pf修改所指的值

    // pt是一个const指针,不能指向其他值,但是它所指的值可以修改。 
    // const指针必须在声明时初始化
    float * const pt = &val;    
    pf = &val;
    // pointer既不能指向其他值也不能修改其指的值
    const float * const pointer = &val;

volatile

volatile限定符告知计算机,代理(不是变量所在的程序)可以改变变量的值。通常他被用于硬件地址以及在其他程序或同时允许的线程中共享数据。
volatile设计编译器的优化。

val1 = x;
val2 = x; // 智能的编译器会注意到代码使用了两次x,但并为改变它的值,于是编译器把x的值临时存储在寄存器中,提高访问速度。
// 如果一些其他代理在以上两条语句之间改变了x的值,就不能这样优化。
// 如果没有volatile关键字,编译器不知道这种事情会发生,
// 如果声明中没有volatile关键字,编译器会假定变量的值在使用过程中不变,然后再尝试优化代码
const volatile int *ploc;
volatile const int lod;
// volatile和const同时限定一个值,设置为程序不能更改的变量,但是可以通过代理改变
// volatile和const的顺序不重要

restrict

restrict关键字允许编译器优化某部分代码以更好的支持计算。
只能用于指针,表明该指针是访问数据对象的唯一且初始的方式。

int ar[10];
int * restrict restar = (int*) malloc(10*sizeof(int));
int * par;
// restar 是访问malloc分配的内存的唯一且初始的方式

for( int n=0;n<10;n++)
{
  par[n] += 5;
  restar[n]+=5;
  ar[n]*=2;
  par[n]+=3;
  restar[n]+=3;
}
// 如果把restar[n]+=5 和restar[n]+=3替换为restar[n]+=8,效果相同
// 但如果把par[n]+=5和par[n]+=3替换为par[n]+=8,将导致计算错误
// 因为par不是访问其执行的数据的唯一访问方式,两次par相关语句之间用ar改变了数据的值

上例中如果使用了restrict关键字,编译器就可以选择捷径优化计算,比如可能选择用restar[n]+=8,
但如果没用,编译器会假设最坏的情况,即两次使用指针之间,存在其他标识符可能改变了数据。

restrict也可以用于函数形参,表明其他标识符不会修改指针指向的数据。

void * memcpy(void * restrict s1, const void * restrict s2, size_t n);
// restrict关键字表示s1和s2都是访问相应数据的唯一方式
void memove(void * s1, const vodi * s2, size_t n);

restrict 关键字有两个作用:

  1. 告诉编译器这是唯一访问数据的方式,可以采取一些优化方案
  2. 告诉用户要使用满足restrict要求的参数

_Atomic

表示相应变量上的操作是原子类型的

_Atomic int hogs;  // hogs是一个原子类型的变量

关键字的新位置

void ofmouth(int * const a1, int * restrict a2, int n);  // 旧风格
void ofmouth(int a1[const], int a2[restrict], int n);  // c99新风格

// static 引入了新的用法,处理表明变量是静态变量外,还可以告诉编译器如何使用形式参数
double stick(double ar[static 20])
// 函数调用中的实际参数应该是一个指向数组首元素的指针,且数组至少有20个元素
// 让编译器使用这些信息优化函数编码

标签:const,int,void,restrict,编译器,volatile,限定符
来源: https://www.cnblogs.com/baiyutang7/p/16333936.html