que - ¿Por qué memset toma un int en lugar de un char?
para que se utiliza memset en c (3)
¿Por qué memset
toma un int
como segundo argumento en lugar de un char
, mientras que wmemset
toma un wchar_t
lugar de algo como long
o long long
?
Vea la respuesta de fred, es por razones de rendimiento.
Por mi lado, he probado este código:
#include <stdio.h>
#include <string.h>
int main (int argc, const char * argv[])
{
char c = 0x00;
printf("Before: c = 0x%02x/n", c);
memset( &c, 0xABCDEF54, 1);
printf("After: c = 0x%02x/n", c);
return 0;
}
Y me da esto en un Mac de 64 bits:
Before: c = 0x00
After: c = 0x54
Entonces, como ves, solo se escribe el último byte. Supongo que esto depende de la arquitectura (endianness).
memset
es anterior a (por poco) la adición de prototipos de funciones a C. Sin un prototipo, no puede pasar un char
a una función - cuando / si lo intentas, será promovido a int
cuando lo pases, y lo que la función recibe es un int
.
También vale la pena señalar que en C, un carácter literal como ''a''
no tiene el tipo char
, tiene el tipo int
, por lo que lo que pase generalmente comenzará como int
. Esencialmente, la única forma de que se inicie como un personaje y se promueva es si se pasa una variable.
En teoría, memset
probablemente podría modificarse para que reciba un char
lugar de un int
, pero es poco probable que haya algún beneficio, y una posibilidad bastante decente de romper un código antiguo u otro. Con un costo desconocido pero potencialmente bastante alto, y casi sin posibilidad de obtener ningún beneficio real, diría que las posibilidades de que se modifique para recibir un char
caen en la línea entre "delgado" y "ninguno".
Editar (respondiendo a los comentarios): Los CHAR_BIT
menos significativos de CHAR_BIT
del int
se utilizan como el valor para escribir en el destino.
Probablemente la misma razón por la que las funciones en <ctypes.h>
toman <ctypes.h>
y no chars
.
En la mayoría de las plataformas, un char
es demasiado pequeño para ser empujado en la pila por sí mismo, por lo que generalmente se empuja el tipo más cercano al tamaño de palabra de la máquina, es decir, int
.
Como lo señala el enlace en el comentario de @ Gui13 , hacerlo también aumenta el rendimiento.