zoukankan      html  css  js  c++  java
  • 【C语言天天练(十九)】restrict关键词

    引言:在内核的系统调用函数里,常常遇到函数的參数使用restrict限定词限定的情况,以下就对该关键词做个总结。

    1、restrict关键词是C99特性才加入的,因此在编译使用含有该限定词的程序时,一定要在后边加入-std=c99的标志,使得gcc能够支持c99标准。

    2、restrict既然是个限定词。那么它限定什么变量呢?它仅仅能限定指针变量。经过它限定的数据对象,表明指针时訪问该数据对象的唯一且初始的方式。注意:这里的唯一表明了,由它限定的指针所指向的数据块。仅仅能由该指针訪问,不能由除它之外的不论什么方式訪问。初始指的是它必须在初始化的时候声明,不能再以后声明。后面给出样例解释。

    3、restrict事实上能够看成仅仅有两个读者。一个是编译器,它告诉编译器能够自由地做一些有关优化的假定。

    还有一个读者是用户,它告诉用户仅适用满足restrict要求的參数。比方,下列两个函数声明:

    void *memcpy(void *restrict s1, const void *restrict s2, size_t n);

    void *memmove(void *s1, const void *s2, size_t n);

    上面两个函数都是从位置s2把n个字节拷贝到位置s1。

    函数memcpy()要求两个位置之间不重叠。但memmove()没有这个要求。

    把s1和s2声明为restrict意味着每一个指针都是对应数据的唯一訪问方式,因此他们不能訪问同一数据块。这满足了不能有重叠的要求。

    程序演示样例restrict.c:

    #include <stdio.h>
    #include <stdlib.h>
    
    int
    main(int argc, char **argv)
    {
    	int n;
    	int ar[5];
    	int	*restrict restar = (int *)malloc(5 * sizeof(int));/*将该指针声明为了restrict。使得这块内存的数据仅仅能由restar訪问,不能由以下的par指针訪问*/
    	int *par = ar;
    
    	for(n = 0; n < 5; n++){
    		par[n] += 5;
    		restar[n] += 5;
    		ar[n] *= 2;
    		par[n] += 3;
    		restar[n] += 3;	
    		printf("ar[%d] = %d
    ", n, restar[n]);
    		printf("ar[%d] = %d
    ", n, ar[n]);
    	}
    
    	return -1;
    }
    编译:gcc restrict.c -std=c99

    运行编译结果:./a.out

    ar[0] = 8
    ar[0] = 4851221
    ar[1] = 8
    ar[1] = 4849653
    ar[2] = 8
    ar[2] = 269027981
    ar[3] = 8
    ar[3] = 2147391485
    ar[4] = 8
    ar[4] = 2614935

    从结果能够看出,通过par指针以及ar所訪问的restar指针所指向的数据并没有起不论什么作用。

    能够改变所指向内存数据的仅仅是restar[n] += 5;与 resatr[n] += 3;这两条语句。事实上编译器会对这两条语句做优化,将它们合并成一条语句:restar[n] += 8;




  • 相关阅读:
    鉴权系统的梳理及并发问题的考虑
    分布式事物解决选择
    电商平台客服和商铺的数据表设计( 初稿记录)43
    问题整理
    关于
    问题整理
    问题整理(常问3连)
    问题整理
    强引用、软引用、弱引用、幻象引用的区别
    通过aop获取切面方法请求入参名称和值的json打印
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10031437.html
Copyright © 2011-2022 走看看