2

注意- 这与限制限定符和指针算术非常相似,但不是重复的。那篇文章的作者将指针的操作结果分配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. 如果我传递了dstself 而不是上面的参数,我知道它是有效的,因为我会将它分配给一个函数的参数本身restrict。在这种情况下,论点是操作的结果dst而不是dst其本身是否会改变事情?我的理由是,参数不会被别名的保证包含在不会被别名的保证中dst

4

1 回答 1

1

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

于 2018-12-14T23:02:34.453 回答