Marvin's Blog【程式人生】

Ability will never catch up with the demand for it

03 May 2014

C语言的restrict pointer和designated initializer

C语言中有两个特性是C++1x还不支持的:restrict pointer和designated initializer,这两个特性都是C99标准引入的。

restrict用来修饰指针。它给编译器一种提示,即当前指针是唯一指向该内存区域的指针,这样编译器可以做相应的优化:

上面的代码,编译器必须假定p1, p2和val有可能指向同一个内存区域,update函数使用了*val两次,每次都会从内存读取,因为编译器无法确定两次使用之间*val的值是否发生变化。

而使用了restrict之后:

编译器把p1, p2和val当作指向不同内存区域的指针,这样*val只要从内存中读取一次并保存到寄存器就行了,每次使用时从寄存器中取值。

当然update函数的调用者必须确保传入的参数p1,p2和val是指向不同内存区域的,也就是说restrict是函数调用时参数传递的一个约定

另一个C++还不支持的特性Designated initializer极大改进了C语言中聚合类型初始化代码的可读性,而且还支持乱序初始化。

请看XL C/C++ V8.0 for Linux文档的例子:

这篇文章更深入讨论了为什么在C++这两个特性缺失。

Categories

Tags