200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > C语言中的类型限定符有哪些?

C语言中的类型限定符有哪些?

时间:2020-08-03 06:34:12

相关推荐

C语言中的类型限定符有哪些?

C语言中有一些关键字起到了限定的作用,他们被称为限定符,那么在C语言中共有几个限定符呢?他们的作用分别是什么呢?本文主要介绍C中4个限定符

1.const2.volatile3.restrict4._Atomic

ANSI C类型限定符

我们通常使用数据类型和存储类别来描述一个变量。C90还新增了俩个属性:恒常性和易变性。这俩个属性可以分别用关键字const和volatile来声明,以这俩个关键字创建的类型是限定类型。C99新增了第三个限定符:restrict,用于提高编译器优化。C11标准新增了第四个限定符:_Atomic.C11提供一个可选库,由stdatomic.h管理。

C99为类型限定符增加了一个新的属性:他们现在是幂等的。意思可以在一条声明中多次使用同一个限定符,多余的限定符会被忽视。

const类型限定符

const主要作用就是设置变量为只读,关于const更加详细的作用可以看博主之前的文章,这里不做过多赘述。const关键字的详细赘述

volatile类型限定符

volatile限定符告知计算机,代理可以改变该变量的值。volatile有什么用呢?他涉及到编译器的优化。

num _1=x;

num _2 =x;

编译器注意到代码俩次都使用了x,但是并未改变其值。于是编译器会把x的值临时存储在寄存器中,然后在num 2需要使用时才从寄存器中读取x的值,这个过程就做高速缓存。但是如果其他代理,在以上俩条语句之间改变了X的值,代码就不可以这样优化了。因此编译器不会轻易进行高速缓冲,这是ANSI之前的情况。现在,如果不在变量前加volatile限定符,编译器默认变量的值在使用的过程中是不变的,可以对其进行高速缓冲,也就是代码优化。

另外,volatile限定符可以和const限定符一起使用。

restrict类型限定符

restrict关键字允许编译器优化某部分代码以更好的支持运算。他只能用于指针表明该指针是访问数据对象的唯一且初始的方式。这么做有什么用呢?下面的代码告诉你。

int ar[10];int * restrict restar=(int *)malloc(10 * sizeof(int));int * par = ar;

这里,指针restar是访问由malloc()所分配内存的唯一且初始的方式,因此可以用regstrict关键字来限制他。而指针par既不是访问ar数组中数据的初始方式,也不是唯一方式。所以不用把他设置为restrict.

现在考虑下面的例子

for(int n=0;n<10;n++){par[n]+=5;restar[n]+=5;ar[n]*=5;par[n]+=3;restar[n]+=3;}

由于之前声明restar是访问他所指向的数据块的唯一方式,编译器可以把涉及restar的俩条语句替换成下面这条语句,效果相同。restar[n]+=8;但是如果把par语句也进行相同的替换,将导致计算错误。使用restrict就是告诉编译器可以选择捷径优化计算。

restrict还可以用于函数形参中的指针,在C99中有俩个函数原型,用于把一个位置上的字节拷贝到另一个位置上。

void * memcpy(void * restrict s1,const void * restrict s2,size_t n);

void * memmove(void * s1,const void * s2,size_t n);

这俩个函数都从位置s2把n个字节拷贝到s1.但是memcpy使用了restrict关键字,这就说明要求拷贝的俩个位置不可以重叠,但是memmove()可以这样。但是这样一来得格外小心,以防在拷贝时覆盖了原本要拷贝的数据。

_Atomic类型限定符(C11)

C11通过包含可选的头文件stdatomic.h和threas.h,提供了一些可选的管理方法。

值得注意的是:要通过各种宏函数来访问原子类型。当一个线程对一个原子类型的对象执行原子操作时,其他线程不能访问该对象。

int hogs;//普通声明hogs = 12;//普通赋值可以替换成_Atomic int hogs;//hogs 是一个原子类型的变量atomic_store(&hogs,12);//stdatomic.h中的宏

这里,在hogs中存储12是一个原子过程,其他线程不能访问。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。