restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样指向这个内存单元的其他指针都是未定义的,直白点就是无效指针(野指针)。这个关键字只能在C99标准的C程序里使用,C++程序不支持,restrict的起源最早可以追溯到Fortran。

下面通过一段小代码来理解一下。

//
//  main.c
//  restrict
//
//  Created by ChengChao on 14-9-27.
//  Copyright (c) 2014年 cc. All rights reserved.
//#include <stdio.h>int main(int argc, const char * argv[]) {int arr[10];//arr和par都可以访问arr指向的这块内存区域int* par = arr;//使用了restrict操作符,意思是只有restar指针可以访问其指向的这块内存,其他指针再指向这块内存时也无法访问int* restrict restar = (int *)malloc(10 * sizeof(int));for (int n = 0; n < 10; n++) {//多个指针都修改了arrpar[n] += 5;arr[n] *= 2;par[n] += 3;//编译器确定只有一个指针修改改内存,就会将下面两行代码优化为 restar[n] += 8//这里可以看一下汇编代码,确实进行了此优化操作restar[n] += 5;restar[n] += 3;}free(restar);return 0;
}

C/C++ restrict修饰符相关推荐

  1. C 线程中容易忽视的 restrict 修饰符修饰

    restrict: 告诉编译器: 更多的使用的是构造函数原型的时候需要对源码进行重构的时候需要注意相关的问题 不同的指针,指向不同的地址,不能指向相同的地址

  2. c/c++ restrict修饰符介绍

    目前正在candence上学习优化算法,知道了一个关键字,总结一番以作记忆. restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编 ...

  3. scala 访问修饰符_Scala中的访问修饰符

    scala 访问修饰符 Access modifiers are used in order to restrict the usage of a member function to a class ...

  4. C语言关键字 数据类型 格式符 修饰符 运算符一览

    文章目录 关键字 数据类型关键字 输出格式符.修饰符 printf 输出格式符 conversion specifier 输出格式符修饰符 modifier 输入格式符.修饰符 scanf 输入格式符 ...

  5. Java 修饰符的总结

    学而时习之,温故而知新. Java的修饰符主要分为2类 1 访问修饰符 2 非访问修饰符 访问修饰符 访问修饰符主要有public,private.protected,default 主要区别 pub ...

  6. java内部类的权限符,static介绍、内部类、final、权限修饰符的作用范围,

    static介绍.内部类.final.权限修饰符的作用范围,static 关键字:(可用于修饰方法.变量) static 特点: static是静态修饰符,一般修饰成员变量.被static修饰的属于全 ...

  7. C#的方法的参数修饰符详解

    方法参数修饰 (啥也没有) 如果参数的修饰是啥也没有,那么其参数传递的方式是值传递,接受方收到的是原始数据的拷贝 out 说明了参数是引用传递. params 可变参,注意了这种修饰符针对的参数一定是 ...

  8. java平台类成员访问修饰符_JAVA类的修饰符及访问权限

    1.类 外部类      class前的修饰符只能有public final abstrct 无(默认) :同包可见  (Eclipse中选择package) 内部类      class前的修饰符有 ...

  9. c语言自定义char*函数返回值是乱码_[每日C语言」printf()函数的修饰符和返回值...

    在上一个小demo<printf()函数(1)>中主要说了一下printf()函数的转换说明符,这些转移说明符是可以被修饰的.我们可以在%d和定义的转义字符之间通过插入修饰符对基本的转换说 ...

最新文章

  1. java8 wordcount_Spark2.x与Java8下WordCount示例
  2. java 并发计数器_Java 8 LongAdders:管理并发计数器的正确方法
  3. 用于语音识别的数据增强
  4. window.open ()的用法
  5. RejectedExecutionException 分析
  6. 计算机课题立项申报书范文,课题立项申请书怎么写
  7. 根据两点经纬度坐标计算距离
  8. 禁忌搜索算法(Tabu Search)
  9. 逍遥单机卡系统服务器ip,逍遥剑侠情缘私服架设源码+APP端+搭建教程
  10. File is included in 4 contexts
  11. Mac安装wget的两种方法
  12. GitChat 是一个怎样的产品?
  13. Minecraft 1.18.1、1.18.2模组开发 21.传送门(Portal)
  14. 计算机是怎么跑起来的——简记
  15. Linux内存、CPU及磁盘空间测试工具
  16. PHP 代码规范风格
  17. 心情不好 可以 看看冯巩的幽默语录
  18. windows 注册表解析
  19. Linux系统安装网络抓包工具wireshark
  20. CM阿里云安装Cloudera Mananger

热门文章

  1. 如何让word左边显示目录
  2. Python3中pass语句介绍
  3. App Inventor 四字节转单精度浮点数
  4. 线性代数笔记3.2向量间的线性关系(二)
  5. 【分享程序员的生活】在国企里面当程序猿是一种怎样的体验!!??
  6. 网络——tcp/ip
  7. [STM32]jlink RTT使用详解
  8. 12864图片显示操作
  9. 设置Linux服务器登录密码过期时长
  10. 【ZZULIOJ】1053: 正弦函数