这是否违反了“restrict”的语义?
Does this violate the semantics of `restrict`?
注意 - 这与 restrict qualifier and pointer arithmetic 非常相似,但不是重复的。 post 的作者将对 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);
}
具体来说,我指的是调用 memcpy
时的 (char*)dst->data + elemSize*oldElemCount
。如果我传递了 dst
本身而不是上面的参数,我知道它是有效的,因为我会将它分配给本身就是 restrict
的函数的参数。在这种情况下,参数是对 dst
而不是 dst
本身的操作结果这一事实是否改变了事情?我的理由是,参数不会被别名的保证包含在 dst
不会被别名的保证中。
这很好,但它实际上没有做任何事情,因为没有时间别名 dst
指针会导致不同的行为。
注意 - 这与 restrict qualifier and pointer arithmetic 非常相似,但不是重复的。 post 的作者将对 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);
}
具体来说,我指的是调用 memcpy
时的 (char*)dst->data + elemSize*oldElemCount
。如果我传递了 dst
本身而不是上面的参数,我知道它是有效的,因为我会将它分配给本身就是 restrict
的函数的参数。在这种情况下,参数是对 dst
而不是 dst
本身的操作结果这一事实是否改变了事情?我的理由是,参数不会被别名的保证包含在 dst
不会被别名的保证中。
这很好,但它实际上没有做任何事情,因为没有时间别名 dst
指针会导致不同的行为。