【发布时间】:2018-12-14 22:58:29
【问题描述】:
注意 - 这与 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);
}
具体来说,我在对memcpy 的调用中指的是(char*)dst->data + elemSize*oldElemCount。如果我传递了dst 本身而不是上面的参数,我知道它是有效的,因为我会将它分配给本身为restrict 的函数的参数。在这种情况下,参数是dst 而不是dst 本身的操作结果这一事实是否会改变事情?我的理由是,不会为参数加上别名的保证包含在dst 不会被别名的保证中。
【问题讨论】:
-
此代码不分配给任何函数参数。 (修改指针指向的数据,不同于赋值给指针)
-
dyn_setElemCount无法写入dst,因为它是按值传递的。如果您的意思是它写入dst指向的内存,那么请更新问题以这样说。目前情况尚不清楚。 -
dst->data的值不继承dst的restrict-ness -
“在这种情况下,参数是对 dst 的操作而不是 dst 本身的结果这一事实会改变吗?”取决于
src是否与dst->data重叠。 -
@M.M 我在传递参数时将参数的本地副本与参数本身混淆了。为什么我不只是说“将参数传递给参数”超出了我的理解。是的,我指的是它指向的数据。我更新了我的帖子。感谢您指出这一点。
标签: c restrict-qualifier