注意-这与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/

10-09 06:25