Czy muszę traktować przypadki, w których faktycznie nie mam nic do przeniesienia / skopiowania z memmove()
/ memcpy()
jako przypadki skrajne?
int numberOfBytes = ...
if( numberOfBytes != 0 ) {
memmove( dest, source, numberOfBytes );
}
czy powinienem po prostu wywołać funkcję bez sprawdzania
int numberOfBytes = ...
memmove( dest, source, numberOfBytes );
Czy sprawdzenie w poprzednim fragmencie jest konieczne?
memcpy
Odpowiedzi:
Ze standardu C99 (7.21.1 / 2):
Więc odpowiedź brzmi: nie; sprawdzenie nie jest konieczne (lub tak; możesz przejść zero).
źródło
n
może mieć wartość zero”. Masz rację, że nie możesz przekazywać zerowych wskaźników, ale nie o to chodzi w pytaniu.Jak powiedział @You, standard określa, że memcpy i memmove powinny obsłużyć ten przypadek bez problemu; ponieważ są one zwykle realizowane w jakiś sposób
nie powinieneś nawet mieć żadnych kar za wydajność poza wywołaniem funkcji; jeśli kompilator obsługuje funkcje wewnętrzne / wbudowane dla takich funkcji, dodatkowe sprawdzenie może nawet spowodować, że kod będzie odrobinę wolniejszy, ponieważ sprawdzanie jest już wykonywane w chwili.
źródło