__restrict

__declspec Podobnie jak modyfikator ( restrict ) słowo kluczowe (dwa wiodące podkreślenia '_') wskazuje, __restrict że symbol nie jest aliasowany w bieżącym zakresie. Słowo __restrict kluczowe różni się od __declspec (restrict) modyfikatora w następujący sposób:

  • Słowo __restrict kluczowe jest prawidłowe tylko dla zmiennych i __declspec (restrict) jest prawidłowe tylko w deklaracjach funkcji i definicjach.

  • __restrict jest podobny do restrict języka C, począwszy od języka C99 i dostępnego w /std:c11 trybie lub /std:c17 , ale __restrict może być używany zarówno w programach C++, jak i C.

  • Gdy __restrict jest używany, kompilator nie będzie propagował właściwości no-alias zmiennej. Oznacza to, że jeśli przypiszesz zmienną __restrict do zmiennej innej__restrict niż zmienna, kompilator nadal zezwoli na alias zmiennej innej niż __restrict. Różni się to od zachowania słowa kluczowego języka restrict C99 C.

Ogólnie rzecz biorąc, jeśli chcesz wpłynąć na zachowanie całej funkcji, użyj __declspec (restrict) zamiast słowa kluczowego .

Aby uzyskać zgodność z poprzednimi wersjami, jest synonimem, _restrict__restrict chyba że określono opcję /Za kompilatora (Wyłącz rozszerzenia języka).

W programie Visual Studio 2015 lub nowszym __restrict można używać w odwołaniach języka C++.

Uwaga

W przypadku użycia w zmiennej, która ma volatile również słowo kluczowe, volatile będzie mieć pierwszeństwo.

Przykład

// __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;
};

Zobacz też

Słowa kluczowe