c++ - ¿Puedo llamar a memcpy() y memmove() con "número de bytes" establecido en cero?
memset (4)
¿Debo tratar casos cuando en realidad no tengo nada que mover / copiar con memmove()
/ memcpy()
como casos memcpy()
int numberOfBytes = ...
if( numberOfBytes != 0 ) {
memmove( dest, source, numberOfBytes );
}
o debería simplemente llamar a la función sin verificar
int numberOfBytes = ...
memmove( dest, source, numberOfBytes );
¿Es necesario el control en el fragmento anterior?
Como dice @You, el estándar especifica que memcpy y memmove deben manejar este caso sin problemas; ya que generalmente se implementan de alguna manera como
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;
}
ni siquiera debería tener ninguna penalidad en el rendimiento que no sea la llamada a la función; si el compilador admite intrínsecos / delimitación para tales funciones, la comprobación adicional puede incluso hacer que el código sea un poco más lento, ya que el control ya está hecho en el momento.
Del estándar C99 (7.21.1 / 2):
Cuando un argumento declarado como
size_t n
especifica la longitud de la matriz para una función,n
puede tener el valor cero en una llamada a esa función. A menos que se indique explícitamente lo contrario en la descripción de una función particular en esta subcláusula, los argumentos del puntero en dicha llamada aún tendrán valores válidos, como se describe en 7.1.4. En dicha llamada, una función que localiza un carácter no encuentra ninguna ocurrencia, una función que compara dos secuencias de caracteres devuelve cero, y una función que copia caracteres copia cero caracteres.
Por tanto, la respuesta es no; el cheque no es necesario (o sí, puedes pasar el cero).
La documentación de memmove
y memcpy
dice esto:
La función no verifica ningún carácter nulo de terminación en la fuente ; siempre copia exactamente el número de bytes .
La documentation opengroup dice básicamente lo mismo.
Entonces, dado que copia "exactamente num bytes", copiará cero bytes cuando num = 0
, y por lo tanto no debería ser necesario tratar esto como un caso especial.
No, el cheque no es necesario. Confiar en que el cero se maneje correctamente es bueno y muy razonable, en mi opinión. Puede valer la pena comentar