auto、register、static、extern是属于存储类修饰符。在声明时,存储类修饰符最多只能使用一个,而且无法用在typeof声明中。

而类型限定符是指const、volatile、restrict。声明中可以使用多个类型限定符,顺序没有限制。另外,类型限制符可以用在typeof声明中。

(1)const

对象的类型如果有const限定符,该对象就是常量;在定义该对象之后,就无法修改它。

具体见下面的例子:

int main()

{

char a[100];

char c[100];

int j=100;

char * p;

const char *b = a;

const int i = j;

const int v[] = {1, 2, 3, 4,

5, 6};

int *k;

strcpy(a, "hello

world!");

strcpy(c, "hello

China!");

b =

c; //可以修改b的值

/

printf("b=[%s]\n", b);

printf("i=[%d]\n", i);

printf("v[0]=[%d]\n",

v[0]);

return 1;

}

(2)volatile

对象的类型如果有volatile限定符,就可能会被其他执行程序或事件所修改。volatile关键字告诉编译器在每次使用此对象的值时,都要重新读取,即使程序本身并没有修改它的值。

(3)restrict

restrict限定符只适用于对象指针类型。这是C99新增加的,用来告诉编译器,此指针所指向的对象如果被修改,就不可以被此指针以外的方式所存取,不管是直接地还是间接地。

C语言关键字__restrict在Cell上的应用

今天看到在一篇FFT在Cell上的优化文章中,提到关键字__restrict,说是它可以减少一些指令之间的dependency。以前还没有用过这个关键字,google了一下,有个理解比较好:

1. 首先我认为restrict只能修饰参数为指针类型的变量,否则没有意义。

2. 它只能用于修饰函数参数,否则也没有意义。

3. 编译器对它的实现是:(用上面那个函数举例,是个int *a加上int *b的函数)

把*a,*b都读入寄存器中(第一次访存),然后函数体内所有引用*a,*b的地方都使用寄存器里的值,所有对它们的修改也写入寄存器中,最后函数返回时,把寄存器中的值写回a,b指向的地址(第二次访存)。如果函数内部大量引用了a,b指向内存的值,这样的策略可以大大减小访存操作从而提高性能。当然,在x86机器上由于通用寄存器少,当寄存器溢出时,会为*a,*b都生成一个copy(这就是所谓的alias),这样反而会降低性能。但对于例如IA64这种有128个通用寄存器的机器来说,性能应该会大大提高。其实说了这么多,一句“进/出拷贝”就可以说明实质。

4.最后我认为restrict修饰集合类型的数据(例如struct)没有意义,因为对结构体的引用是多次访存,无法通过把值加载到寄存器中而避免多余的访存操作。

在Cell编程中,有些指针只是用来存储数据,某一个函数中总是访问某一个指针的不同区域,这样这个指针声明为__restrict是再好不过了,可以减少存取内存的操作,数据第一次载入寄存器后可以使用到函数退出才写入内存(如果寄存器足够容纳这些数据)。

C99 中新增加了 restrict 修饰的指针: 由 restrict

修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由

restrict 修饰的指针表达式中。

由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict

数据类型不改变程序的语义。 编译器能通过作出 restrict

修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。

[典型例子] memcpy() 在 C99 中,restrict 可明确用于 memcpy() 的原型,而在 C89 中必须进行解释。

void *memcpy(void *restrict str1, const void *restrict str2, size_t

size);

指针在声明的时候可以用关键字restrict修饰,如

int *restrict p;

将告诉编译器,指针p是访问p所指对象的唯一方式

c语言restrict和const,C语言中const、volatile、restrict等类型限定符的区别相关推荐

  1. c语言 函数参数 const,c语言中const的使用方法

    c语言中const的使用方法 发布时间:2020-06-22 16:03:32 来源:亿速云 阅读:188 作者:Leah 这篇文章运用简单易懂的例子给大家介绍c语言中const的使用方法,代码非常详 ...

  2. const在c语言中作用,在C语言中const作用全面总结.doc

    在C语言中const作用全面总结 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助.Const 是C++中常 ...

  3. int在c语言中的作用,C语言中int,Uint,uint16等有什么区别以及用处

    C语言中int,Uint,uint16等有什么区别以及用处.在C中,既然有了int,为什么还要有uint?特别是uint16,uint32等又有什么用?他们有什么区别?" --------- ...

  4. c语言虚数变量,关于C语言中的Complex(复数类型)和imaginary(虚数类型)

    关于C语言中的Complex(复数类型)和imaginary(虚数类型) 其实这里的复数complex就是数学里的复数,包含实部和虚部两个部分,比如:x=2.1+6i,下面进行详细介绍. C99 新增 ...

  5. c语言中计算long,C语言中int、long int、long long的区别

    1.关于int 和 long int (1)在VC下没有区别.两种类型均用4个字节存放数据. (2)VC是后出的编译器,之前有很多早期的C编译器,在早期编译器下long int占4个字节,int占2个 ...

  6. c语言数组前const的作用,c语言中const的用法

    C语言作为一门新型高级编程语言,在计算机软件编程中具有较为广泛的应用和实现.下面小编就跟你们详细介绍下c语言中const的用法,希望对你们有用. c语言中const的用法如下: const的基本解释 ...

  7. C语言中定义常量的关键字是什么,C++_详解C语言中const关键字的用法,关键字const用来定义常量,如 - phpStudy...

    详解C语言中const关键字的用法 关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const ...

  8. const 作用 c语言,在C语言中const 作用的的全面总结.doc

    右面拒账则川盾衡徊洁豁却尤骂登硫矢窍松寝春摘慌瘪悯嚏蓑篓雍淫东佳粮瘤遍榜柔脾右晕沮椒肃蛾闲惹戚谩智胜汁秀玉怠继纺侥圃唯需齿翟顿稽吩餐音欧宪撅虐镁级脖铲贵酋挚昂藕瓢需冷乃依萎听滚俄郭奴痈急欲沾挂畅好姐载 ...

  9. c语言中const的作用面试,C语言const关键字作用

    C语言中const代表着"不可变",基本和常量一样不可修改,但是应用场景不一样. 一.应用在变量 const char a='A'; a='B';  //错误,变量a的值不可以修改 ...

最新文章

  1. 面试官比较看重简历中的哪些维度,有什么写简历的技巧、建议和总结?
  2. 基于php编写的新闻类爬虫,插入WordPress数据库
  3. 巧妙解法:买卖股票最佳时机
  4. Leetcode4-寻找两个正序数组的中位数原理及代码实现
  5. .net Int16 、(int Int32)、 Int64 的区别
  6. python中利用matplotlib画图
  7. Java多线程编程 — 锁优化
  8. python自动填写小程序表单_新年好!教大家用Python写一个自动回复拜年信息的小程序!...
  9. CSS可见区域全局居中
  10. EXTJS 双层表头 记录
  11. 大数据之-Hadoop3.x_MapReduce_WordCount编写_Driver---大数据之hadoop3.x工作笔记0091
  12. 21个js 技巧收藏
  13. python解析json串与正则匹配对比
  14. Prescan入门教程之避坑笔记:初学者初用
  15. docker wordpress Error establishing a database connection 方法之一
  16. frp内网穿透疑难杂症【1】do http proxy request [host:www.xxx.xxx] error: no root found: www.xxx.xxx
  17. 身份证号码正则表达式 阿星小栈
  18. nape.dynamics.InteractionGroup
  19. CE_tutorial_game
  20. 接口测试平台代码实现138: 关于大用例登陆态干扰bug

热门文章

  1. 三分钟读懂什么是EVM
  2. ps切图后 JAVA开发_做一个会PS切图的前端开发
  3. 第三方支付平台排行!
  4. LTE(4G) - NR(5G) RRC连接重配置(RRC Connection Reconfiguration)
  5. linux MMC framework(5) - mmc card driver
  6. 正则表达式 bs4解析 xpath解析
  7. ubuntu java 关闭进程_如何在Ubuntu中关闭Tomcat?
  8. 亚洲与大洋洲经济自由度指数(1995-2021年)
  9. PyCharm中Debug模式进行调试详解
  10. 长沙中学计算机编程培训,长沙中学生寒假编程培训