Situation with `restrict` keyword/attribute in C++ standard
Nothing like C’s restrict
is in even C++20. The paper already mentioned was well-received at a preliminary presentation in November 2018, perhaps because it avoids the critical difficulty with a qualifier—that no one, even in C, understands how it interacts with the rest of the type system. Part of this is because adding restrict
doesn’t change the meaning of any one pointer, but affects its relationship with some set of other pointers (whose membership is not well-specified) based on what arithmetic is performed with them later. Another part is because C++ allows so many operations with types: what would std::vector<T *restrict>
mean, and what would be the type of indexing a std::vector<T> &restrict
?
Just what practical optimization opportunity will be offered by such a contract-based approach is not yet clear; there are still many unanswered questions about contracts and optimization in general.
Realistic usage of the C99 'restrict' keyword?
restrict
says that the pointer is the only thing that accesses the underlying object. It eliminates the potential for pointer aliasing, enabling better optimization by the compiler.
For instance, suppose I have a machine with specialized instructions that can multiply vectors of numbers in memory, and I have the following code:
void MultiplyArrays(int* dest, int* src1, int* src2, int n)
{
for(int i = 0; i < n; i++)
{
dest[i] = src1[i]*src2[i];
}
}
The compiler needs to properly handle if dest
, src1
, and src2
overlap, meaning it must do one multiplication at a time, from start to the end. By having restrict
, the compiler is free to optimize this code by using the vector instructions.
Wikipedia has an entry on restrict
, with another example, here.
Why is the restrict keyword not part of C++?
There are several issues in defining "restrict" in C++, some of them are listed in WG paper N3635: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3635.pdf "Towards restrict-like semantics for C++"
Some possible issues with restrict in C++ are:
- Restrict Class members and indirection with “this pointer”
- Passing of restrict qualifiers into functions, functors, lambdas, and templates
- Escaping of restrict pointer values inside functions
- Overlapping array members, strides
Document also list several C++ compilers with limited "restrict" support for C++.
There is also interesting history note in N3635 about non-inclusion of restrict to C++:
At the time of reviewing C99 feature inclusion in C++ during the Mont Tremblant meeting, restrict was considered but was waiting a paper proposal although none came forward....
Restrict is a C99 feature and was never designed to work in class abstractions and it may have to do with that pointers are not common in C++. ... it was designed for fine-grain aliasing for C, but not well-designed for type-based aliasing in C++
Related Topics
Is It Good Practice to Null a Pointer After Deleting It
Variadic Template Pack Expansion
How to Use Sdl2 in My Programs Correctly
Can Modern X86 Hardware Not Store a Single Byte to Memory
Remove Spaces from Std::String in C++
Difference Between _Tmain() and Main() in C++
C++ Templates That Accept Only Certain Types
Pure Virtual Function With Implementation
How to Use the Conditional (Ternary) Operator
How to Clear a Stringstream Variable