Могу ли я вызвать memcpy () и memmove () с «числом байтов», установленным в ноль?

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

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

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

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

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

81 голос | спросил sharptooth 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 20 Sep 2010 17:14:35 +0400 2010, 17:14:35

2 ответа


0

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

  

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

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

ответил Mike Seymour 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 20 Sep 2010 17:32:11 +0400 2010, 17:32:11
0

Как сказал @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;
}

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

ответил Matteo Italia 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 20 Sep 2010 17:33:08 +0400 2010, 17:33:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132