【问题标题】:Does this violate the semantics of `restrict`?这是否违反了 `restrict` 的语义?
【发布时间】: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 的值不继承dstrestrict-ness
  • “在这种情况下,参数是对 dst 的操作而不是 dst 本身的结果这一事实会改变吗?”取决于src 是否与dst->data 重叠。
  • @M.M 我在传递参数时将参数的本地副本与参数本身混淆了。为什么我不只是说“将参数传递给参数”超出了我的理解。是的,我指的是它指向的数据。我更新了我的帖子。感谢您指出这一点。

标签: c restrict-qualifier


【解决方案1】:

这很好,但它并没有真正做任何事情,因为没有时间给 dst 指针加上别名会导致不同的行为。

【讨论】:

  • 它与src 不同,尽管它是void*,它可以指向任何东西。
猜你喜欢
  • 1970-01-01
  • 2014-02-15
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多