zoukankan      html  css  js  c++  java
  • C语言中关键字restrict的概念,使用范围,例子

      概念:

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

      渊源:

      restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr访问到,任何同样指向这个内存单元的其他指针都是未定义的,直白点就是无效指针。restrict 的出现是因为 C 语言本身固有的缺陷,C 程序员应当主动地规避这个缺陷,而编译器也会很配合地优化你的代码.

      使用场景:

    • 非常需要性能。
    • 需要改写指针的所指物。
    • 明确知道某两个指针在业务逻辑上不会、也不能重叠

      例子:

     1 #include <stdio.h>
     2 
     3 int foo(int *a, int *b)
     4 {
     5     *a = 5;
     6     *b = 6;
     7     return *a + *b;
     8 }
     9  
    10 int rfoo(int *restrict a, int *restrict b)
    11 {
    12     *a = 5;
    13     *b = 6;
    14     return *a + *b;
    15 }
    16 
    17 int main()
    18 {
    19     int i =0;
    20     int *a = &i;
    21     int *b = &i;
    22     
    23     printf("%d ",foo(a,b));
    24     printf("%d ", rfoo(a,b));
    25 
    26 }

      在gcc 8.1 下的运行结果:

      

      不过,我有一点是疑惑的,暂时没有想清楚,就是我在自己的ubuntu 16.04上编译,一直是不会运行出来11的结果,感觉是这个关键字没有起作用,网上查了一下没有查到原因,请知道答案的朋友解释一下,多谢.

    参考文档:

    1 https://en.cppreference.com/w/c/language/restrict

    2 https://baike.baidu.com/item/restrict/7384270?fr=aladdin

  • 相关阅读:
    flash中网页跳转总结
    as3自定义事件
    mouseChildren启示
    flash拖动条移出flash无法拖动
    需要一个策略文件,但在加载此媒体时未设置checkPolicyFile标志
    Teach Yourself SQL in 10 Minutes
    电子书本地转换软件 Calibre
    Teach Yourself SQL in 10 Minutes
    Teach Yourself SQL in 10 Minutes
    Teach Yourself SQL in 10 Minutes – Page 31 练习
  • 原文地址:https://www.cnblogs.com/dylancao/p/9951838.html
Copyright © 2011-2022 走看看