注意-这与restrict qualifier and pointer arithmetic非常相似,但不是重复项。该帖子的作者将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
本身而不是上面的参数,我知道它是有效的,因为我将其分配给本身为restrict
的函数的参数。在这种情况下,参数是对dst
而不是dst
本身进行运算的结果,这一事实是否会改变情况?我的理由是,保证不会{@ {1}}被包含在保证不别名的情况下。
答案 0 :(得分:1)
这很好,但是实际上并没有做任何事情,因为没有时间别名dst
指针会导致不同的行为。