zoukankan      html  css  js  c++  java
  • C语言restrict限定符

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

    例子1:

    int func(int *x, int *y)
    {
      *x = 0;
      *y = 1;
      return *x;
    }
    
    //这种情况情况下,对*的赋值可能影响*x,因为x,y可能指向同一地址,所以编译器不会进行代码优化
    int func(int * restrict x, int * restrict y)
    {
      *x = 0;
      *y = 1;
      return *x;
    }
    
    //编译器可以根据限定符确定*y赋值不会影响到*x,所以可以将上述代码的返回语句优化成return 0;

    例子2:

    //限定符告诉编译器两个缓冲区互不影响,没有重叠部分,可以直接将元缓冲区内容复制到目标缓冲区
    void * memcpy(void * restrict s1, const void * restrict s2, size_t n);
    
    
    //缓冲区可能有重叠部分,则需要先复制到一个临时缓冲区,再复制到目标缓冲区
    void * memmove(void * s1, const void * s2, size_t n);
  • 相关阅读:
    c/c++字符串传递
    从一个小程序明白new和delete的奇特现象
    Linux下构造函数string需要注意的问题
    字符串转time_t
    CentOS7基础建站指南(笔记)
    图与搜索
    面向的对象编程的小猫腻
    多线程编程
    生产者消费者模式-Java实现
    Java-代理模式的理解
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/5332888.html
Copyright © 2011-2022 走看看