173 votes

Pourquoi utiliser bzero plus de memset?

Dans une Programmation de Systèmes de classe, j'ai pris ce semestre précédent, nous avons dû mettre en place une base client/serveur en C. Lors de l'initialisation des structures, comme sock_addr_in, ou char tampons (que nous avons utilisé pour échanger des données entre le client et le serveur), le professeur nous a enseigné à n'utiliser bzero et pas memset pour les initialiser. Il n'a jamais expliqué pourquoi, et je suis curieux de savoir si il y a une raison valable pour cela?

Je vois ici: http://fdiv.net/2009/01/14/memset-vs-bzero-ultimate-showdown qu' bzero est plus efficace en raison du fait que n'est jamais va être mise à zéro de la mémoire, de sorte qu'il n'a pas à faire toute vérification supplémentaire qu' memset peut faire. Ce n'est pas nécessairement sembler une raison absolument pas à l'utiliser memset pour la réinitialisation de la mémoire.

bzero est considéré comme obsolète, et en outre n'est pas un standard C de la fonction. Selon le manuel, memset qui est privilégiée bzero pour cette raison. Alors, pourquoi voudriez-vous d'utiliser encore bzero sur memset? Juste pour les gains d'efficacité, ou est-il quelque chose de plus? De même, quels sont les avantages de l' memset sur bzero qui en font de facto de l'option privilégiée pour les nouveaux programmes?

160voto

ouah Points 75311

Je ne vois pas de raison de préférer bzero sur memset.

memset est une norme fonction C tout bzero n'a jamais été une norme C de la fonction. La raison en est probablement parce que vous pouvez obtenir exactement les mêmes fonctionnalités à l'aide d' memset fonction.

Maintenant en ce qui concerne l'efficacité, compilateurs comme gcc utiliser builtin pour les implémentations memset qui passent à un particulier lors de la mise en œuvre d'une constante 0 est détecté. De même pour glibc lorsque les objets internes sont désactivés.

72voto

austin Points 3677

Je devine que vous avez utilisé (ou votre professeur a été influencé par) UNIX Réseau de Programmation par W. Richard Stevens. Il utilise bzero souvent à la place de memset, même dans les plus up-to-date de l'édition. Le livre est si populaire, je pense que c'est devenu un langage de programmation de réseau qui est pourquoi vous voyez toujours qu'il a utilisés.

Je m'en tiendrais à memset simplement parce qu' bzero est obsolète et réduit la portabilité. Je doute que vous n'obtiendrez pas de réels gains de l'utilisation de l'un sur l'autre.

58voto

Michael Burr Points 181287

Le seul avantage que je pense, bzero() a plus de memset() pour le réglage de la mémoire à zéro est qu'il y a un peu moins de chances d'avoir commis une erreur.

Plus d'une fois j'ai rencontré un bug qui ressemblait à:

memset(someobject, size_of_object, 0);    // clear object

Le compilateur ne se plaignent pas (mais peut-être manivelle jusqu'à certains niveaux d'alerte sur certains compilateurs) et l'effet sera que la mémoire n'est pas effacée. Parce que ce n'est pas trash de l'objet, il laisse tout seul - il y a de bonnes chances que le bug peut pas se manifester en quoi que ce soit évident.

Le fait qu' bzero() n'est pas standard est un irritant mineur.

4voto

paxdiablo Points 341644

Probablement, vous ne devriez pas utiliser bzero, ce n'est pas vraiment standard C, c'était une POSIX chose.

Et de noter que le mot "est" - il été déprécié dans POSIX.1-2001 et retiré dans POSIX.1-2008 date, par déférence pour memset de sorte que vous êtes mieux à l'aide de la fonction C standard.

2voto

Tal Bar Points 21

En bref: memset nécessitent plus d'opérations d'assemblage, puis bzero.

C'est la source: http://fdiv.net/2009/01/14/memset-vs-bzero-ultimate-showdown

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X