In the C programming language, as of the C99 standard, restrict
is a keyword that can be used in pointer declarations. The restrict
keyword is a declaration of intent given by the programmer to the compiler. It says that only the pointer or a value based on the pointer (such aspointer+1) will be used to access the object it points to. This limits the effects of pointer aliasing, aiding optimization. If the declaration of intent is not followed and the object is accessed by an independent pointer, this will result in undefined behavior.
[edit]Optimization
If the compiler knows that there is only one pointer to a memory block, it can produce better code. The following hypothetical example makes it clearer:
void updatePtrs(size_t *ptrA, size_t *ptrB, size_t *val)
{
*ptrA += *val;
*ptrB += *val;
}
In the above code, the pointers ptrA
, ptrB
, val
might refer to the same memory location, so the compiler will generate a less optimal code :
load R1 ← *val ; Load the value of val pointer
load R2 ← *ptrA ; Load the value of ptrA pointer
add R2 += R1 ; Perform Addition
set R2 → *ptrA ; Update the value of ptrA pointer
; Similarly for ptrB, note that val is loaded twice,
; because ptrA may be equal to val.
load R1 ← *val
load R2 ← *ptrB
add R2 += R1
set R2 → *ptrB
However if the restrict
keyword is used and the above function is declared as :
void updatePtrs(size_t *restrict ptrA, size_t *restrict ptrB, size_t *restrict val);
then the compiler is allowed to assume that ptrA
, ptrB
, val
point to different locations and updating one pointee will not affect the other pointees. The programmer, not the compiler, is responsible for ensuring that the pointers do not point to identical locations.
Now the compiler can generate better code as follows:
load R1 ← *val
load R2 ← *ptrA
add R2 += R1
set R2 → *ptrA
; Note that val is not reloaded,
; because the compiler knows it is unchanged
load R2 ← *ptrB
add R2 += R1
set R2 → *ptrB
Note that the above assembly code is better and the val
is loaded once.
Another example is of memcpy
. The two pointers used as arguments to memcpy(void*, void*, nbytes)
are declared with restrict
, which tells the compiler of the memcpy
function that the two data areas do not overlap. This allows the compiler to produce a faster memcpy
function. However, if a programmer uses the same pointer for both arguments, the behavior of the memcpy
function will be undefined.
Refer: http://en.wikipedia.org/wiki/Restrict
分享到:
相关推荐
4. **函数原型多态性**:通过`restrict`关键字,程序员可以指示编译器某些指针参数不会重叠,从而帮助优化代码。 5. **块级作用域的外部变量**:C99允许在函数内声明具有外部链接的变量,这在以前的版本中是不允许...
5. **限制符(Restrict Keyword)**: - `restrict`关键字用于告诉编译器指针指向的数据不会与任何其他指针重叠。 - 这有助于优化器生成更高效的代码。 - 示例:`void function(float *restrict input, float *...
11. **_restrict Keyword**: `_restrict`关键字(在某些编译器中为`restrict`)用来指示编译器变量之间不存在隐式共享,有助于优化。 以上就是C99标准引入的一些核心知识点。这些变化不仅扩展了C语言的功能,还...
9. **`restrict`关键字**:这个关键字用于告诉编译器,指针参数不会通过其他途径访问同一块内存,从而允许编译器进行更有效的优化。 10. **`_Bool`类型**:C99定义了一个新的布尔类型`_Bool`(通常宏定义为`bool`)...
C99引入了restrict关键字,用于表示指针指向的数据不会被其他指针同时访问,这在多线程环境下特别有用,可以优化编译器生成的代码,提高程序运行速度。 #### 3. 增强类型支持 C99增加了对更大数据类型的支持,如`_...
### C99标准详解:构建高效C程序的基石 C99是ISO/IEC 9899:1999标准的简称,作为C语言的重要里程碑,它在C90的基础上进行了诸多改进和扩展,旨在提升C语言的性能、可移植性和安全性。本文将基于《C99标准参考文档》...
3. **类型安全的指针运算**:C99引入了`restrict`关键字,用于告诉编译器某变量不会通过其他指针访问,从而能进行更有效的优化。 4. **复数类型**:标准库提供了`<complex.h>`头文件,支持复数运算。 5. **枚举...
Visual Studio2008下C99头文件,解决了C99标准没有被包含在VC中的一小部分问题
C99 的标准,官方资料,可以参考学习。
在使用FFmpeg时,有时会遇到需要兼容C99标准的情况,因为FFmpeg的部分源代码是用C99特性编写的。C99是C语言的一个重要版本,于1999年发布,引入了许多新的特性,增强了语言的功能和可读性。 标题中的"c99int_v101...
一共三个文档,c语言的c99标准,C99Rationale解释c的语言原理,对理解c很有帮助,还有就是K&R。三个文档是大部分c语言问题的终点,也是某些问题的源头~ 开源是一种精神
4. **类型安全的指针运算**:C99引入了`restrict`关键字,用于告诉编译器某些变量不会通过指针重叠访问,从而可能提高优化程度。 5. **内联函数(Inline Functions)**:C99强化了内联函数的概念,以减少函数调用...
标题中的“c99 to c89 工具”指的是将符合C99标准的C语言代码转换为符合C89标准的工具。C99是C语言的第四个主要版本,于1999年发布,引入了许多新特性,如内联函数、变长数组、复杂的枚举类型等。而C89则是C90的别称...
它还引入了限制性更强的类型限定符`restrict`,用于指定指针变量只能访问特定的内存区域,从而提高了数据访问的安全性和效率。 #### 结论 综上所述,C99标准的TC1、TC2和TC3技术报告不仅巩固了C语言的基础地位,还...
《C语言规范标准-C99(中文版)》是C编程语言的一个重要版本,由国际标准化组织ISO/IEC制定,旨在提供一个清晰且统一的编程标准,以便开发者编写出可移植性强、易于理解的代码。C99标准在1999年发布,相较于之前的C89...
根据给定文件的信息,我们可以深入探讨C99标准及其对编程领域的影响。C99是C语言的一个标准版本,由美国国家标准协会(ANSI)和国际电工委员会(IEC)等机构共同制定,并于2000年正式发布。这个标准在C语言的发展...
C99标准是C语言的一个重要版本,由国际标准化组织(ISO)于1999年发布,全称为ISO/IEC 9899:1999。这个标准在C89(也称为C90)的基础上进行了许多改进和扩展,引入了许多新的特性,提升了C语言的灵活性和效率。以下...