10
votes

Est-il garanti que le memset est-il à zéro des bits de rembourrage dans une structure?

en général, selon la norme C, il garantit que le memset () avec 0 sera nul les bits de rembourrage dans une structure C?

Quoi de GCC?

Par exemple, quelque chose comme: xxx


6 commentaires

Pouvez-vous nous montrer un échantillon de code?


Je ne comprends pas ce qui témoigne de ça.


Puis Réponse courte: Oui. Il va zéro la région de la mémoire entière occupée par ms . Bits de rembourrage et tout ...


@Mk, j'ai vu un commentaire quelque part que "ne pas les structures MEMCMP, même si vous aviez des memsser ces structures avant de les utiliser". Ce que je pensais, c'est si les bits de rembourrage sont déjà memsse à 0, il n'y aura aucun problème pour l'utilisation de MEMCMP plus tard. Peut-être la référence que j'ai trouvée est fausse.


Je pense que cela pourrait être une bonne idée de ne pas compter sur MEMCMP de comparer vos structures, car si vous envisagez de vous oublier de memsse, vous auriez une méchante difficile à trouver un bug sur vos mains. Donc, à moins qu'il ait été prouvé qu'il s'agissait d'un cou de bouteille de performance, écrivez la fonction de comparaison explicite. Imaginez également une situation où vous avez un charcuter [20] et dans une structure que vous avez définie sur "AAA" et dans une autre à "BBB", puis vous définissez les deux "C". Les structures sont maintenant logiquement égales mais MEMCMP les verra comme différents.


@Mk, merci. Maintenant, j'ai pourquoi ne devrions-nous pas comparer la structure même après le memset à 0.


3 Réponses :


11
votes

Oui, Memset CODE> Écrit une valeur 32 bits dans une région contiguë de mémoire d'une longueur donnée à partir de l'adresse donnée. Dans votre cas, Memset écrit la région avec (valeur 32 bits) 0 code>.

Donc, si vous faites un memset code> de longueur Tailleof (votre_tructeur) code >, vous devriez être bien: P>

memset(&ms, 0, sizeof(struct MyStruct));


0 commentaires

15
votes

Peut-être à noter que memset ne sait rien de votre structure (ou de votre tableau ou de la primitive, ni de la mémoire de la mémoire que vous vous trouvez à libérer), donc même si elle voulait Pour laisser les bits de rembourrage intacts, il ne saurait même pas où ils sont.


1 commentaires

Ce n'est pas vrai; Tous les compilateurs récents connaissent la sémantique du Memset et optimisent autour de cela, et le compilateur fait sur le dos où le rembourrage est.



8
votes

Si cela compte, vous faites probablement quelque chose de dangereux et de non-portable.

oui, le memset L'appel définit tous les bits de remplissage (ou octets) sur 0 - mais il n'y a aucune garantie dans la langue qui définit un float objet à tous- Bits-Zero le définira à 0,0. Il en va de même pour les pointeurs: tous les bits-zéro ne sont pas garantis comme un pointeur nul. (Dans les deux cas, il s'agit de la plupart des implémentations.)

La norme originale ISO C90 ou C99 n'a même pas garanti que tous les bits-zéro sont une représentation valide de 0 pour les types entier; L'une des corrigendes techniques post-C99 a ajouté une telle garantie (pour les types entier uniquement).

Pour la portabilité, si vous voulez que quelque chose soit zéro, définissez-le explicitement. Vous pouvez également profiter de l'initialisation de la valeur zéro pour les objets statiques et des membres omis dans les initialiseurs.

Un Nitpick Terminologique: "Bits de rembourrage" fait partie de la représentation des types d'entier (et il n'y en a généralement pas). Le rembourrage entre les membres de la structure est le rembourrage octets .


0 commentaires