Могу ли я вызвать memcpy () и memmove () с нулевым числом байтов? - PullRequest
84 голосов
/ 20 сентября 2010

Нужно ли рассматривать случаи, когда мне фактически нечего перемещать / копировать с memmove() / memcpy() как крайние случаи

int numberOfBytes = ...
if( numberOfBytes != 0 ) {
    memmove( dest, source, numberOfBytes );
}

или я должен просто вызвать функцию без проверки

int numberOfBytes = ...
memmove( dest, source, numberOfBytes );

Нужна ли проверка в предыдущем фрагменте?

Ответы [ 2 ]

124 голосов
/ 20 сентября 2010

Из стандарта C99 (7.21.1 / 2):

Если аргумент, объявленный как size_t n, указывает длину массива для функции, n может иметь значение нольна вызов этой функции.Если явно не указано иное в описании конкретной функции в этом подпункте, аргументы указателя при таком вызове должны по-прежнему иметь действительные значения, как описано в 7.1.4.При таком вызове функция, которая находит символ, не находит вхождения, функция, которая сравнивает две последовательности символов, возвращает ноль, а функция, которая копирует символы, копирует ноль символов.

Таким образом, ответ - нет;проверка не нужна (или да; вы можете пройти ноль).

3 голосов
/ 20 сентября 2010

Как сказал @You, стандарт указывает, что memcpy и memmove должны обрабатывать этот случай без проблем;поскольку они обычно реализуются как-то вроде

void *memcpy(void *_dst, const void *_src, size_t len)
{
    unsigned char *dst = _dst;
    const unsigned char *src = _src;
    while(len-- > 0)
        *dst++ = *src++;
    return _dst;
}

, у вас даже не должно быть никакого снижения производительности, кроме вызова функции;если компилятор поддерживает встроенные функции / встраивание для таких функций, дополнительная проверка может даже сделать код немного-чуть медленнее, поскольку проверка уже выполнена в то время.

...