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;
for(int n=0;n<10;n++) {par[n]+=5;restar[n]+=5;ar[n]*=5;par[n]+=3;restar[n]+=3; }
restrict还可以用于函数形参中的指针,在C99中有俩个函数原型,用于把一个位置上的字节拷贝到另一个位置上。
void * memcpy(void * restrict s1,const void * restrict s2,size_t n);
_Atomic类型限定符(C11)
C11通过包含可选的头文件stdatomic.h和threas.h,提供了一些可选的管理方法。
值得注意的是:要通过各种宏函数来访问原子类型。当一个线程对一个原子类型的对象执行原子操作时,其他线程不能访问该对象。
int hogs;//普通声明 hogs = 12;//普通赋值 可以替换成 _Atomic int hogs;//hogs 是一个原子类型的变量 atomic_store(&hogs,12);//stdatomic.h中的宏
这里,在hogs中存储12是一个原子过程,其他线程不能访问。
C语言中的类型限定符有哪些?相关推荐
- C语言中的类型限定符.const限定符
目录 1.1const限定符 1.1.1const限定符修饰普通对象 1.1.2const限定符修饰数组元素 1.1.3const限定符修饰指针类型对象 1.1.4const限定符修饰函数形参类型为数 ...
- C++ 中的类型限定符 类型限定符提供了变量的额外信息。
类型限定符提供了变量的额外信息. 限定符 含义 const const 类型的对象在程序执行期间不能被修改改变. volatile 修饰符 volatile 告诉编译器不需要优化volatile声明的 ...
- C语言类型限定符(type specifier)(一)——volatile详细教程
前言:C语言有几个类型限定符(type specifier),如C90中的const和volatile,C99中的restrict,C11中的_Atomic,除了const以外,很多书籍对于其他几个修 ...
- C语言volatile类型限定符详解
一.volatile类型限定符 volatile是一个类型修饰符(type specifier),就像我们熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量:volatile的作用是作 ...
- c语言restrict和const,C语言中const、volatile、restrict等类型限定符的区别
auto.register.static.extern是属于存储类修饰符.在声明时,存储类修饰符最多只能使用一个,而且无法用在typeof声明中. 而类型限定符是指const.volatile.res ...
- 学习笔记9-C语言-传参、类型限定符、递归
函数传参: 1.形参变量属于它所在的函数,出了该函数就不能使用 2.实参与形参之间都是以赋值的形式进行数据传递(值传递) 3.return 其实是把返回值数据放置到一个公共的区域(函数和函数调用者), ...
- c++类之“对象包含与成员函数不兼容的类型限定符”与“对象含有与成员 函数 “CarBody::Geta” 不兼容的类型限定符”错误的修改
首先看一段代码 #include<iostream> using namespace std; int car_num=0; struct position {double x, y; } ...
- C语言中不同类型的取值范围
C语言中的不同类型的取值范围 前言 C语言中,我们知道最基本的数据类型有int整型,float和double浮点型,char字符型,在计算机里,他们的取值并不是任意和无限的,都有相应的取值范围,那么计 ...
- C语言中不同类型的循环(Different types of loops in C)
C语言中有三种类型的循环:for,while,do-while. while循环先判断循环条件. while (condition) {//gets executed after condition ...
最新文章
- 能“预测未来”的AI来了!谷歌DeepMind推Dreamer,训练时间减半
- 【Thread】- ReentrantLock、ReentrantReadWriteLock
- 大学生学业指导类书目
- springboot profiles
- 修改主机名hosts
- C# task和timer实现定时操作
- setTimeout 和 setInterval
- 2020-11-04关于出现tomcat启动失败的一种原因
- eclipse中的java包awt_Eclipse中打包java程序
- 鸿蒙轻内核源码分析:MMU协处理器
- Android studio 0.5.0 注意事项
- 计算机开题报告中的研究方法,开题报告:经济学写论文用到的五种研究方法
- 【小程序】小游戏开发工具详解(上)
- Python的学习笔记案例4--52周存钱挑战5.0
- 注册苹果开发者账号遇到问题汇总
- 分组背包+树形DP(BY LPX)
- 新型旅游网站热地带SEO优化建议
- Androidstudio ADB调试
- 推荐一款十分强大的富文本编辑器
- 笔记1-----校园网进知网步骤
热门文章
- linux配置ftp错误530,ubuntu16安装配置ftp服务(和530错误解决)
- html设置只在最后一页显示页脚,在Word里怎么设置页脚只在最后一页显示?
- 使用tkinter实现 loading 等待效果
- 使用IntelliJ Idea新建SpringBoot项目
- 二叉树层次遍历(借助队列实现)
- 读书节最该买的书,我都帮你们挑出来了
- 【图像压缩】DCT图像无损压缩【含GUI Matlab源码 726期】
- 南昌大学科学技术学院计算机专业,南昌大学科学技术学院
- 编程老手的哪些特点,是值得新手程序员学习的?
- Altium Designer笔记之有效低信号的顶线