本篇博客主要谈论C语言关键字restrict,只用于修饰指针,功能是帮助编译器进行优化!值得注意的是,优化需要就事论事,经过分析:如果发现确实优化不了,就不优化了。不加restrict关键字修饰的指针,编译器一定不进行优化!

目录

一、 定义

1.1 概念

1.2 目的

二、 实例

2.1 利用并行拆分循环

2.2 Target Code Optimizer(目标代码优化器)


一、 定义

1.1 概念

关键字restrict只用于限定指针,表明本指针是访问一个数据对象的惟一且初始的方式。

1.2 目的

关键字的用意是充分发挥多处理器(CPU只有1个)的并行性。并行的含义就和下面这句古文的含义很类似。注意和并发作区别。

并发是基于时间片轮转的,故而从宏观上看,各个进(线)程是一起运行的,微观上是串行的。并行就像是多向车道一样(车道数目------核数),各个进(线)程运行互不干扰。

屠惧,投以骨。一狼得骨止,一狼仍从。复投之,后狼止而前狼又至。骨已尽矣,而两狼之并驱如故。

------狼三则·其二(蒲松龄)

二、 实例

实例不胜枚举,在这里我举用两个例子。

2.1 利用并行拆分循环

void add(const double *x, const double *y, double *res)
{int i;for(i = 0; i < 6; ++i)res[i]= x[i] + y[i];
}

情形一二的前提:假设数组x和数组y内存无重叠,但是数组x和数组res内存有重叠:

情形一、假设如图1 所示:res[i]依赖于res[i-1]的值,无法优化。

图1 内存有重叠1

情形二、假设如图2 所示:res[5]依赖于res[0]的值,没有办法去做优化。

图2 内存有重叠2

情形三的前提:假设数组x,y,res内存均有重叠:

情形三:假设如图3 所示,res[0...3]的计算没有依赖性,res[4...5]存在依赖性,无法优化。

图3 内存有重叠3

总结:内存重叠存在的话,是无法进行优化的,因为不存在一劳永逸的办法解决这个问题。

最理想的情形:

假设x,y,res三者指向的内存空间不会重叠, 如果这个函数将在多处理器的环境下执行,编译器可能会做这样的优化:把一个循环拆成两个循环,一个处理器计算res[0...2],另一个处理器计算res[3...5],两个处理器可以同时工作,使计算时间理论上缩短一半,同时保证了结果的正确性。如果程序员已经能够保证内存不重叠的话,就有必要指定restrict允许编译器进行优化。

2.2 Target Code Optimizer(目标代码优化器)

--------参考文献   余甲子,石凡,潘爱民.程序员自我修养[M].北京:电子工业出版社,2009.4:45-47.

说明:例子为源代码是不合适的,因为目标代码优化器操作的对象是目标代码(x86的汇编语言),但是可以帮助我们理解使用关键字restrict进行优化的过程。

int ar[10];
int* par = ar;    //既可以通过par也可以通过ar访问本数组restrict int* p1 = (int*)malloc(10 * sizeof(int));for(int i = 0; i < 10; ++i)
{par[i] += 5;    //语句1p1[i] += 5;     //语句2arr[i] *= 2;    //语句3par[i] += 3;    //语句4p1[i] += 3;    //语句5
} 

p1存在restrict修饰,含义就是p1所指向的空间只会由p1去修改,故而语句2和语句5可以合并为一句。ar或者par都不能指定为restrict,二者深层次原因是不同的——ar不能指定是唯一性不满足,par不能指定是唯一性和初始性同时不满足(何为唯一性、初始性看本博客1.1节)。

优化后的结果可能是这样的,语句5和并入语句2;修改语句2,删除语句5:

int ar[10];
int* par = ar;    //既可以通过par也可以通过ar访问本数组restrict int* p1 = (int*)malloc(10 * sizeof(int));for(int i = 0; i < 10; ++i)
{par[i] += 5;    //语句1p1[i] += 8;     //语句2arr[i] *= 2;    //语句3par[i] += 3;    //语句4
} 

关键字_restrict相关推荐

  1. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  2. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  3. volatile关键字之全面深度剖析

    引言 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字 ...

  4. mysql屏蔽关键字实现方法_PHP屏蔽过滤指定关键字的方法

    本文实例讲述了PHP屏蔽过滤指定关键字的方法.分享给大家供大家参考.具体分析如下: 实现思路: 一.把关键字专门写在一个文本文件里,每行一个,数量不限,有多少写多少. 二.PHP读取关键字文本,存入一 ...

  5. Java 静态变量,静态方法,静态常量(java static 关键字)

    Java 静态变量,静态方法,静态常量  就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main ...

  6. Java this 关键字使用

    this 引用就是本类的一个对象 理解这句话看下面一段代码 package me; public class Me {String name; //成员变量int age;public Me(Stri ...

  7. java 关键字(面试题)

    学而时习之,温故而知新. 今天群里有人问java中true ,false 是关键字吗, 这里记录下,不是关键字,我还特意翻看之前的书看看 下面是 Java 语言保留使用的 50 个关键字: 关键字 g ...

  8. java中标识符,关键字,数据类型

    什么是标识符? 在java语言中用来给一个类,变量或方法命名的符号 标识符的命名规则 标识符可以由字母.数字.下划线(_).美元符($)组成,但不能包含 @.%.空格等其它特殊字符,不能以数字开头. ...

  9. iOS面试题整理---关键字!!!

    关键字整理 static 1.static全局变量与普通的全局变量有什么区别? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式, 静态全局变量当 ...

最新文章

  1. Vitamio打造自己的Android万能播放器
  2. HttpContext.Current.Cache vs. HttpRuntime.Cache
  3. php接收文件,如何通过php 发送与接收流文件
  4. [原创]2014年上半年测试书籍推荐
  5. jqprint控件使用
  6. linux下用gtk+写比赛赌博GUI小游戏
  7. 项目遇到技术难题,领导让我假招聘套取解决方案,我没有照做,结果15天后蒙了
  8. 剧情介绍:“我是山姆”
  9. CentOS 常用命令及快捷键整理[转载]
  10. 【从 0 开始机学习】正则化技术原理与编程!
  11. 使用 YARD Stick One 进行重放信号
  12. VS编译NPAPI:jref类型出错
  13. Neo4j下载与安装
  14. 国内航线图 或城市之间连接图
  15. 电力网络安全监测装置_10月 长沙 电力监控系统安全防护技术研修班
  16. Linux介绍及基本操作
  17. Go-Excelize API源码阅读(二十五)——GetSheetName、GetSheetIndex、GetSheetMap()
  18. 想下以前的CyanogenMod 源码怎么办
  19. python requests返回结果带\\u的解决方法
  20. oracle 取月份的第一天

热门文章

  1. 【数字信号去噪】基于matlab粒子群算法优化VMD分解分量选择数字信号降噪【含Matlab源码 1979期】
  2. 项目一:Java 计算器实现
  3. 城市污泥类毕业论文文献有哪些?
  4. Docker使C盘爆满问题
  5. [转] Himi 著作《Android游戏编程之从零开始》★书籍源码+第4/6/7样章—免费下载★...
  6. TCP timewait和closewait?2MSL?
  7. php closewait,CLOSE_WAIT问题终于解决了。
  8. cgb2109-day18
  9. 在电脑上播放HDTV高清影片的基本知识和方法
  10. wafer php demo,GitHub - forging2012/wafer-php-server-demo: Wafer - 企业级微信小程序全栈方案...