注意-这与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
本身是否会改变事情我的理由是,保证参数不会被别名包含在保证dst
不会被别名的范围内。 最佳答案
这很好,但它实际上什么也做不了,因为没有时间对指针进行别名处理会导致不同的行为。
关于c - 这是否违反了“限制”的语义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53787934/