Skip to content

Commit fa7a6dc

Browse files
author
Colin Robertson
authored
Merge pull request MicrosoftDocs#167 from manbearian/patch-1
Remove __declspec(noalias) from example
2 parents 054b945 + 02c6d1a commit fa7a6dc

File tree

1 file changed

+98
-24
lines changed

1 file changed

+98
-24
lines changed

docs/cpp/restrict.md

Lines changed: 98 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: "restrict | Microsoft Docs"
33
ms.custom: ""
4-
ms.date: "11/04/2016"
4+
ms.date: "02/09/2018"
55
ms.reviewer: ""
66
ms.suite: ""
77
ms.technology: ["cpp-language"]
@@ -18,30 +18,104 @@ manager: "ghogen"
1818
ms.workload: ["cplusplus"]
1919
---
2020
# restrict
21-
**Microsoft Specific**
21+
22+
**Microsoft Specific**
23+
24+
When applied to a function declaration or definition that returns a pointer type, `restrict` tells the compiler that the function returns an object that is not *aliased*, that is, referenced by any other pointers. This allows the compiler to perform additional optimizations.
25+
26+
## Syntax
27+
28+
> **__declspec(restrict)** *pointer_return_type* *function*();
2229
23-
Applied to a function declaration or definition that returns a pointer type and tells the compiler that the function returns an object that will not be aliased with any other pointers.
30+
## Remarks
31+
32+
The compiler propagates `__declspec(restrict)`. For example, the CRT `malloc` function has a `__declspec(restrict)` decoration, and therefore, the compiler assumes that pointers initialized to memory locations by `malloc` are also not aliased by previously existing pointers.
33+
34+
The compiler does not check that the returned pointer is not actually aliased. It is the developer's responsibility to ensure the program does not alias a pointer marked with the `restrict __declspec` modifier.
2435

25-
## Syntax
26-
27-
```
28-
__declspec(restrict) return_type f();
29-
```
30-
31-
## Remarks
32-
The compiler will propagate `__declspec(restrict)`. For example, the CRT `malloc` function is decorated with `__declspec(restrict)` and therefore, pointers initialized to memory locations with `malloc` are also implied to not be aliased.
33-
34-
The compiler does not check that the pointer is actually not aliased. It is the developer's responsibility to ensure the program does not alias a pointer marked with the `restrict __declspec` modifier.
35-
36-
For similar semantics on variables, see [__restrict](../cpp/extension-restrict.md).
36+
For similar semantics on variables, see [__restrict](../cpp/extension-restrict.md).
37+
38+
For another annotation that applies to aliasing within a function, see [__declspec(noalias)](../cpp/noalias.md).
3739

40+
For information about the **restrict** keyword that is part of C++ AMP, see [restrict (C++ AMP)](../cpp/restrict-cpp-amp.md).
41+
3842
## Example
39-
See [noalias](../cpp/noalias.md) for an example using `restrict`.
40-
41-
For information about the restrict keyword that is part of C++ AMP, see [restrict (C++ AMP)](../cpp/restrict-cpp-amp.md).
42-
43-
**END Microsoft Specific**
44-
45-
## See Also
46-
[__declspec](../cpp/declspec.md)
47-
[Keywords](../cpp/keywords-cpp.md)
43+
44+
The following sample demonstrates the use of `__declspec(restrict)`.
45+
46+
When `__declspec(restrict)` is applied to a function that returns a pointer, this tells the compiler that the memory pointed to by the return value is not aliased. In this example, the pointers `mempool` and `memptr` are global, so the compiler can't be sure that the memory they refer to is not aliased. However, they are used within `ma` and its caller `init` in a way that returns memory that isn't otherwise referenced by the program, so `__decslpec(restrict)` is used to help the optimizer. This is similar to how the CRT headers decorate allocation functions such as `malloc` by using `__declspec(restrict)` to indicate that they always return memory that cannot be aliased by existing pointers.
47+
48+
```C
49+
// declspec_restrict.c
50+
// Compile with: cl /W4 declspec_restrict.c
51+
#include <stdio.h>
52+
#include <stdlib.h>
53+
54+
#define M 800
55+
#define N 600
56+
#define P 700
57+
58+
float * mempool, * memptr;
59+
60+
__declspec(restrict) float * ma(int size)
61+
{
62+
float * retval;
63+
retval = memptr;
64+
memptr += size;
65+
return retval;
66+
}
67+
68+
__declspec(restrict) float * init(int m, int n)
69+
{
70+
float * a;
71+
int i, j;
72+
int k=1;
73+
74+
a = ma(m * n);
75+
if (!a) exit(1);
76+
for (i=0; i<m; i++)
77+
for (j=0; j<n; j++)
78+
a[i*n+j] = 0.1f/k++;
79+
return a;
80+
}
81+
82+
void multiply(float * a, float * b, float * c)
83+
{
84+
int i, j, k;
85+
86+
for (j=0; j<P; j++)
87+
for (i=0; i<M; i++)
88+
for (k=0; k<N; k++)
89+
c[i * P + j] =
90+
a[i * N + k] *
91+
b[k * P + j];
92+
}
93+
94+
int main()
95+
{
96+
float * a, * b, * c;
97+
98+
mempool = (float *) malloc(sizeof(float) * (M*N + N*P + M*P));
99+
100+
if (!mempool)
101+
{
102+
puts("ERROR: Malloc returned null");
103+
exit(1);
104+
}
105+
106+
memptr = mempool;
107+
a = init(M, N);
108+
b = init(N, P);
109+
c = init(M, P);
110+
111+
multiply(a, b, c);
112+
}
113+
```
114+
115+
**END Microsoft Specific**
116+
117+
## See also
118+
119+
[Keywords](../cpp/keywords-cpp.md)
120+
[__declspec](../cpp/declspec.md)
121+
[__declspec(noalias)](../cpp/noalias.md)

0 commit comments

Comments
 (0)