C `restrict` keyword in D
Uknown via Digitalmars-d
digitalmars-d at puremagic.com
Sat Sep 2 20:04:58 PDT 2017
In C, the `restrict` keyword implies that 2 or more pointer
arguments in a function call do not point to the same data. This
allows for some additional optimizations which were not possible
before, finally making C as fast as Fortran.
e.g.
This is the new definition for memcpy in C99
void* memcpy(void *restrict dst, const void *restrict src, size_t
n);
`dst` and `src` should never point to the same block of memory,
and this is enforced by the programmer.
In D, it makes sense to add a similar functionality, that extends
beyond just performance optimizations. It could potentially be
used to better guarantee @safety of some code.
e.g. (from discussions about ref counting in D) :
void main() @safe
{
auto arr = RCArray!int([0]);
foo(arr, arr[0]);
}
void foo(ref RCArray!int arr, ref int val) @safe
{
{
auto copy = arr; //arr's (and copy's) reference counts are both 2
arr = RCArray!int([]); // There is another owner, so arr
// forgets about the old payload
} // Last owner of the array ('copy') gets destroyed and
happily
// frees the payload.
val = 3; // Oops.
}
Here, adding `restrict` to foo's parameters like so :
void foo(restrict ref RCArray!int arr, restrict ref int val)
would make the compiler statically enforce the fact that neither
references are pointing to the same data. This would cause an
error in main, since arr[0] is from the same block of memory as
arr.
The same would apply for pointers.
I just hope to have a nice discussion on this topic here.
Thanks!
Read more about `restrict` here :
http://en.cppreference.com/w/c/language/restrict
More information about the Digitalmars-d
mailing list