注意- 这与限制限定符和指针算术非常相似,但不是重复的。那篇文章的作者将指针的操作结果分配restrict
给同一个指针,而我将指针的操作结果restrict
作为参数分配给restrict
函数参数。
我在很大程度上理解了 的含义restrict
,并且我开始养成restrict
在适用时声明函数参数的习惯。但我不确定我是否在这里滥用它。
struct DynArray
{
void* data;
size_t elemCount;
size_t len;
};
void dyn_append(DynArray* restrict dst, const void* restrict src, size_t srcLen, size_t elemSize)
{
size_t oldElemCount = dst->elemCount;
dyn_setElemCount(dst, dst->elemCount + srcLen, elemSize); // might write to `*dst`
if (dst->data) // `dst->data` is set to `NULL` if reallocation fails.
// The next line might violate "restrict-ness" of `dst`.
memcpy((char*)dst->data + elemSize*oldElemCount, src, elemSize * srcLen);
}
具体来说,我(char*)dst->data + elemSize*oldElemCount
在调用中指的是memcpy
. 如果我传递了dst
self 而不是上面的参数,我知道它是有效的,因为我会将它分配给一个函数的参数本身restrict
。在这种情况下,论点是操作的结果dst
而不是dst
其本身是否会改变事情?我的理由是,参数不会被别名的保证包含在不会被别名的保证中dst
。