类型限定词restrict
关键字restrict通过允许编译器优化某几种代码增强了计算支持。它只可用于指针,并表明指针是访问一个数据对象的惟一且初始的方式。为了清楚这样做为何有用,我们需要看一些例子。考虑下面的代码:
int ar[10];
int * restrict restar = (int *) malloc(10 * sizeof(int));
int * par = ar;
这里,指针restar是访问由malloc()分配的内存的惟一且初始的方式。因此,它可以由关键字restrict限定。然而,par指针既不是初始的,也不是访问数组ar中数据的惟一方式,因此不可以把它限定为restrict。
现在考虑下面这个更复杂的例子,其中n是一个int:
for(n=0; n < 10; n++)
{
par[n] += 5;
restart[n] += 5;
ar[n] *= 2;
par[n] += 3;
restar[n] += 3;
}
知道了restar是访问它所指向数据块的惟一初始方式,编译器就可以用具有同样效果的一条语句来代替包含restar的两个语句:
restar[n] += 8;
然而,将两个包含par的语句精简为一个语句将导致计算错误:
par[n] += 8;
出现错误结果的原因是循环在par两次访问同一个数据之间,使用ar改变了该数据的值。
没有关键字restrict,编译器将不得不设想比较糟的那种情形,也就是两次使用指针之间,其他标识符可能改变了数据的值。使用restrict关键字之后,编译器可以放心地寻找计算的捷径。
可以将关键字restrict作为指针型函数参量的限定词使用。这意味着编译器可以假定在函数体内没有其他标识符修改指针指向的数据,因而可以试着优化代码,反之则不然。例如,C库中有两个函数可以从一个位置把数据复制到另一个位置。在C99标准下,他们的原型如下:
void * memcpy(void * restrict dst, const void * restrict src, size_t n);
void * memmove(void * dst, const void * src, size_t n);
两个函数都从位置src把n个字节复制到dst中。函数memcpy()要求两个位置之间不重叠,但memmove()没有这个要求。把dst和src声明为restrict意味着每个指针都是相应数据的惟一访问方式,因此他们不能访问同一数据块。这满足了不能有重叠的要求。函数memmove()允许重叠,它不得不在复制数据时更加小心,以防在使用数据前就覆盖了数据。
关键字restrict有两个读者。一个是编译器,它告诉编译器可以自由地做一些有关优化的假定。 另一个读者是用户,它告诉用户仅使用满足restrict要求的参数。 一般,编译器无法检查您是否遵循了这一限制,如果您蔑视它也就是在让自己冒险。
(以上大部分内容摘自《C Primer Plus》)

C语言中关键字restrict的用法(linux 为 __restrict)相关推荐

  1. c语言 u2_printf,C语言中关键字restrict的概念,使用范围,例子

    概念: restrict,C语言中的一种类型限定符(Type Qualifiers),用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容. 渊源: res ...

  2. C语言中关键字void的用法

    void在英文中作为名词的解释为"空虚:空间:空隙":而在C语言中,void被翻译为"无类型",相应的void *为"无类型指针".void ...

  3. c语言中关键字static_了解C ++中Static关键字的变体

    c语言中关键字static Hello, folks! Today we will be unveiling another important aspect in the series of our ...

  4. C语言中图形函数及其用法

    C语言中图形函数及其用法  Turbo C 2.0具有丰富的图形功能,它提供了70多个图形函数.在这里只介绍最常用的一部分,其余的图形函数及用法可参阅相关书籍.图形函数均在头文件"graph ...

  5. C语言中关键字const、typedef

    const:const是C语言的一个关键字,是用来定义常量的.const是常属性的意思,当一个变量被const修饰之后,其值不能再被改变了,但它仍然是一个变量,只不过有了常属性. 我们如何才能验证这一 ...

  6. C语言的关键字restrict,C语言中restrict关键字学习

    简介:程序员 restrict是c99标准引入的,它只能够用于限定和约束指针,并代表指针是访问一个数据对象的惟一且初始的方式.即它告诉编译器,全部修改该指针所指向内存中内容的操做都必须经过该指针来修改 ...

  7. c语言中关键字的含义,c语言中的关键字有哪些?有什么含义?

    c语言中的关键字有哪些?有什么含义? 发布时间:2020-04-23 09:33:30 来源:亿速云 阅读:174 作者:小新 这篇文章主要介绍了c语言中的关键字有哪些?有什么含义?,具有一定借鉴价值 ...

  8. 怎么在c语言中使用常用对数,【用法】在C语言中使用对数函数的方法

    这篇文章主要介绍了在C语言中使用对数函数的方法,包括以e为底和以10为底的对数计算,需要的朋友可以参考下. C语言log()函数:返回以e为底的对数值 头文件: #include log() 函数返回 ...

  9. c语言中结构体的用法

    一.定义 由于一个数组中只能存放同一种类型的数据,很不方便,所以C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,也就是结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的 ...

最新文章

  1. java 复制对象有哪些方式
  2. linux___ip
  3. 论文笔记:Group Equivariant Convolutional Networks
  4. 12864液晶——读写、划点、划线、汉字、32*16的字符
  5. xubuntu14.04下编译pjsip及pjsua2 java
  6. Pixhawk---超声波模块添加说明(I2C方式)
  7. c#实例-子线程查找另一线程模态对话框句柄(invoke测试)
  8. window location href 手机端无法跳转_Window对象在前端领域的角色
  9. 作为后端开发如何设计数据库系列文章 设计SaaS系统表结构
  10. 93没有了_93平旧两居大变身,二手房这样装修10万块搞定
  11. docker 安装mysql_安装docker并使用docker安装mysql
  12. 【刘文彬】 Controller:EOS区块链核心控制器
  13. 01. 慎重选择容器类型
  14. freeCodeCamp Falsy Bouncer
  15. Kali使用beef
  16. 【CF480D】Parcels DP
  17. dgraph部署和使用
  18. 6000字用户成长分析体系。
  19. java背单词软件_背单词的java小软件
  20. 后疫情时代 亿联网络的攻与守

热门文章

  1. android 图片 drawable,在android中Drawable图片使用教程
  2. c语言实现数独游戏求解
  3. 一个80后创业的好榜样
  4. python中的除法运算_python中矩阵除法运算的三种实现方法
  5. 给学计算机的出国学生送什么礼物,美国大学生最喜欢收到的礼物清单 你知道吗...
  6. mongoTemplate增删改查
  7. 飞桨助力岩石薄片种类鉴定,助你轻松成为地质达人
  8. 客户价值分析。[技术]
  9. 最新必备员工手册大全
  10. 港大CS笔试面试分享