这是否违反了“限制”的语义?

时间:2018-12-14 22:58:29

标签: c restrict-qualifier

注意-这与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本身进行运算的结果,这一事实是否会改变情况?我的理由是,保证不会{@ {1}}被包含在保证不别名的情况下。

1 个答案:

答案 0 :(得分:1)

这很好,但是实际上并没有做任何事情,因为没有时间别名dst指针会导致不同的行为。