C语言的关键字restrict,C语言中restrict关键字学习
简介:程序员
restrict是c99标准引入的,它只能够用于限定和约束指针,并代表指针是访问一个数据对象的惟一且初始的方式.即它告诉编译器,全部修改该指针所指向内存中内容的操做都必须经过该指针来修改,而不能经过其它途径(其它变量或指针)来修改;这样作的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何一样指向这个内存单元的其余指针都是未定义的,直白点就是无效指针。restrict 的出现是由于 C 语言自己固有的缺陷,C 程序员应当主动地规避这个缺陷,而编译器也会很配合地优化你的代码.数组
考虑下面的例子:函数
int ar[10];
int * restrict restar=(int *)malloc(10*sizeof(int));
int *par=ar;
这里说明restar是访问由malloc()分配的内存的惟一且初始的方式。par就不是了。
那么:
for(n=0;n<10;n++)
{
par[n]+=5;
restar[n]+=5;
ar[n]*=2;
par[n]+=3;
restar[n]+=3;
}
由于restar是访问分配的内存的惟一且初始的方式,那么
编译器
能够将上述对restar的操做进行优化:
restar[n]+=8;
而par并非访问数组ar的惟一方式,所以并不能进行下面的优化:优化
par[n]+=8;spa
由于在par[n]+=3前,ar[n]*=2进行了改变。使用了
关键字
restrict,编译器就能够放心地进行优化了。
这个关键字听说来源于古老的FORTRAN。有兴趣的看看这个。
C库中有两个函数能够从一个位置把字节复制到另外一个位置。在C99标准下,它们的原型以下:.net
void * memcpy(void * restrict s1, const void * restrict s2, size_t n);
void * memove(void * s1, const void * s2, size_t n);
这两个函数均从s2指向的位置复制n字节数据到s1指向的位置,且均返回s1的值。二者之间的差异由关键字restrict形成,即memcpy()能够假定两个内存区域没有重叠。memmove()函数则不作这个假定,所以,复制过程相似于首先将全部字节复制到一个临时缓冲区,而后再复制到最终目的地。若是两个区域存在重叠时使用memcpy()会怎样?其行为是不可预知的,既能够正常工做,也可能失败。在不该该使用memcpy()时,编译器不会禁止使用memcpy()。所以,使用memcpy()时,您必须确保没有重叠区域。这是程序员的任务的一部分。
关键字restrict有两个读者。一个是编译器,它告诉编译器能够自由地作一些有关优化的假定。另外一个读者是用户,他告诉用户仅使用知足restrict要求的参数。通常,编译器没法检查您是否遵循了这一限制,若是您蔑视它也就是在让本身冒险。
原文:http://blog.csdn.net/llf021421/article/details/8092602指针
书本C Primer Plus第12章 12.7.3 类型限定词restrictrest
C语言的关键字restrict,C语言中restrict关键字学习相关推荐
- c语言typeof 变量,c语言中typeof关键字
为什么因为一个关键字而专门写一篇随笔呢?因为这个关键字在Linux里面地位非同一般!这个关键字typeof在linux内核里面使用非常广泛! 下面这两个等效声明,用于声明int类弄的变量a typeo ...
- C语言中定义常量的关键字是什么,C++_详解C语言中const关键字的用法,关键字const用来定义常量,如 - phpStudy...
详解C语言中const关键字的用法 关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const ...
- c语言关键字extern作用,C语言中extern关键字详解
<C语言中extern关键字详解>由会员分享,可在线阅读,更多相关<C语言中extern关键字详解(5页珍藏版)>请在人人文库网上搜索. 1.C 语言中 extern 关键字详 ...
- C语言中static关键字详解
C语言中staic关键字很简单,简单到你的任何一个项目中可以不写一个staic关键字也是没有问题的.写这篇章主要是一下自己的staic的理解和应用,当然在章开头依旧要照本宣科简述一下static关键字 ...
- c语言用string类型,c语言中的string
1. strlen(char const* s); 函数传入的是c风格字符串(即以'\0'结尾的字符数组),返回的长度为size_t(即unsigned int),其长度不包括'\0'. 2. str ...
- c语言typedef的用法,C语言中typedef用法总结,看完就能像编程老手一样熟练运用...
请看下文 C语言中typedef关键字应用比较常见,许多C语言初学者对它的用法不甚了解.事实上,我们可以用typedef来定义自己习惯使用的数据类型名称,可以替代自己所熟悉的基本类型.数组类型.指针类 ...
- C语言中extern关键字的使用
C语言中extern关键字的使用,直接上代码. file1.c文件 #include<stdio.h> extern long power(int); int A = 2; int mai ...
- java可以使用c语言中的输入,c语言中的scanf在java中应该怎么表达,Scanner类。
1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...
- 【✊基础不牢,地动山摇のC语言中static关键字✊】
C语言中static关键字 用static声明限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译源文件的剩余部分.要降对象指定为静态存储,可以在正常的声明之前加上关键字static作为前缀. ...
最新文章
- 入门深度学习,但你知道哪些情况下不该使用深度学习吗?
- 荐号 | 技术人如何在职场竞争中处于优势地位
- 判断链表中是否有环(环形链表)
- sql优化ppt_一款跨平台免费的开源 SQL 编辑器和数据库管理器!
- 文巾解题 797. 所有可能的路径
- Linux内存管理之一 分段与分页
- c语言推箱子给上颜色,本人的C语言大作业——推箱子
- 【kafka】kafka 消息 重放 从 一个 topic 导入 另外一个 topic
- CF719E. Sasha and Array [线段树维护矩阵]
- 英国电信选择由 Canonical 开发的 Ubuntu OpenStack 作为云平台
- Android消除Toast延迟显示
- 仓储管理之计价方法——移动加权平均法
- min函数python_python内置函数之min
- Visio绘图工具,“连接线”命令使用方法
- js刻度尺插件_html5 canvas+js刻度尺代码
- 数模国赛计算机要学什么,数学建模国赛经验分享
- word修订模式怎么彻底关闭_如何去掉word修订模式
- 使用YOLOX进行物体检测
- torch当中的MseLoss的reduction参数
- 新版Edge检查项F12控制台改为英文