Нарушает ли это семантику слова «ограничить»?

ПРИМЕЧАНИЕ. Это очень похоже на ограничить квалификатор и арифметику указателя , но не является дубликатом. Автор этого поста присвоил результат операций над указателем 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 не будет псевдонимом.


person Isaac Saffold    schedule 14.12.2018    source источник
comment
Этот код не назначается ни одному из параметров функции. (Изменение данных, на которые указывает указатель, отличается от назначения указателю)   -  person M.M    schedule 15.12.2018
comment
dyn_setElemCount не может записать в dst, потому что он передается по значению. Если вы имеете в виду, что он записывает в память, на которую указывает dst , то, пожалуйста, обновите вопрос, чтобы сказать об этом. Как обстоят дела, вопрос не ясен.   -  person M.M    schedule 15.12.2018
comment
Значение dst->data не наследует restrict-ность dst   -  person M.M    schedule 15.12.2018
comment
Изменяет ли дело в данном случае тот факт, что аргумент является результатом операций с dst, а не с самим dst? Зависит от того, пересекается ли src с dst->data.   -  person chux - Reinstate Monica    schedule 15.12.2018
comment
@ M.M Я перепутал локальную копию параметра, когда он передал аргумент с самим параметром. Почему я просто не сказал, что передал аргумент параметру, мне не понятно. И да, я имел в виду данные, на которые он указывает. Я обновил свой пост. Спасибо, что указали на это.   -  person Isaac Saffold    schedule 15.12.2018


Ответы (1)


Это хорошо, но на самом деле это ничего не делает, потому что нет времени, когда псевдоним указателя dst вызовет другое поведение.

person Ted Percival    schedule 14.12.2018
comment
Это имеет значение для src, хотя, поскольку это void*, оно может указывать на что угодно. - person Zan Lynx; 15.12.2018