Skip to content

Latest commit

 

History

History
56 lines (46 loc) · 2.21 KB

extension-restrict.md

File metadata and controls

56 lines (46 loc) · 2.21 KB
title ms.custom ms.date ms.technology ms.topic f1_keywords dev_langs helpviewer_keywords ms.assetid author ms.author ms.workload
__restrict | Microsoft Docs
11/04/2016
cpp-language
language-reference
__restrict_cpp
C++
__restrict keyword [C++]
2d151b4d-f930-49df-bd16-d8757ec7fa83
mikeblome
mblome
cplusplus

__restrict

Like the __declspec ( restrict ) modifier, the __restrict keyword indicates that a symbol is not aliased in the current scope. The __restrict keyword differs from the __declspec ( restrict ) modifier in the following ways:

  • The __restrict keyword is valid only on variables, and __declspec ( restrict ) is only valid on function declarations and definitions.

  • __restrict is similar to restrict from the C99 spec, but __restrict can be used in C++ or C programs.

  • When __restrict is used, the compiler will not propagate the no-alias property of a variable. That is, if you assign a __restrict variable to a non-__restrict variable, the compiler will still allow the non-__restrict variable to be aliased. This is different from the behavior of the restrict keyword from the C99 specification.

Generally, if you affect the behavior of an entire function, it is better to use __declspec ( restrict ) than the keyword.

In Visual Studio 2015 and later, __restrict can be used on C++ references.

Note

When used on a variable that also has the volatile keyword, volatile will take precedence.

Example

// __restrict_keyword.c  
// compile with: /LD  
// In the following function, declare a and b as disjoint arrays  
// but do not have same assurance for c and d.  
void sum2(int n, int * __restrict a, int * __restrict b,   
          int * c, int * d) {  
   int i;  
   for (i = 0; i < n; i++) {  
      a[i] = b[i] + c[i];  
      c[i] = b[i] + d[i];  
    }  
}  
  
// By marking union members as __restrict, tell compiler that  
// only z.x or z.y will be accessed in any given scope.  
union z {  
   int * __restrict x;  
   double * __restrict y;  
};  

See also

Keywords