Pourquoi memset
prend un int
comme deuxième argument au lieu d'un char
, alors que wmemset
prend un wchar_t
au lieu de quelque chose comme long
ou long long
?
Réponses
Trop de publicités?memset
antérieure (très peu) l'ajout de prototypes de fonction à C. Sans un prototype, vous ne pouvez pas passer un char
à une fonction-quand/si vous essayez, il va être promu int
quand vous le passer, et ce que la fonction reçoit est un int
.
Il est également intéressant de noter que, dans C, un caractère littéral comme 'a'
ne pas avoir de type char
-- elle est de type int
, de sorte que vous passer sera généralement commencer comme un int
de toute façon. Essentiellement, le seul moyen pour elle de commencer comme un char et obtenir une promotion si vous passez un char
variable.
En théorie, memset
pourrait probablement être modifiée de sorte qu'il reçoit un char
au lieu d'un int
, mais il y a peu de chances d'être un avantage, et pas mal de possibilité de casser quelques vieux code, ou d'autres. Avec une inconnue, mais potentiellement coût assez élevé, et presque aucune chance de l'avantage réel, je dirais que les chances d'être modifié pour recevoir un char
automne à droite sur la ligne entre "slim" et "aucun".
Edit (réponse aux commentaires): L' CHAR_BIT
bits de poids faible de l' int
sont utilisés en tant que valeur à écrire sur la cible.
Probablement la même raison que les fonctions en <ctypes.h>
prendre ints
et pas chars
.
Sur la plupart des plates-formes, un char
est trop petit pour être placé sur la pile par lui-même, donc en général on pousse le type le plus proche de la machine de la taille de mot, c'est à dire int
.
Comme le lien de @Gui13s'commentaire souligne, en faisant cela augmente également les performances.
En fait, il peut prendre un argument char (qui est implicitement converti par le compilateur en entier). Jetez un œil à ceci:
http://www.cplusplus.com/reference/clibrary/cstring/memset/
(Il s'agit en fait de C ++ mais cela fonctionne également avec C)
Il en va de même pour wmemset.
Voir la réponse de Fred, c'est pour des raisons de performances.
De mon côté, j'ai essayé ce code:
#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;
}
Et cela me donne ceci sur un Mac 64 bits:
Before: c = 0x00
After: c = 0x54
Donc, comme vous le voyez, seul le dernier octet est écrit. Je suppose que cela dépend de l'architecture (endianness).