200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > c语言restrict和const C语言中const volatile restrict等类型限定符的区别

c语言restrict和const C语言中const volatile restrict等类型限定符的区别

时间:2024-08-23 10:31:16

相关推荐

c语言restrict和const C语言中const volatile restrict等类型限定符的区别

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所指对象的唯一方式

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。