2013-08-20 2 views
32

Gibt es einen Grund die Nicht-Standard-bzero() und bcopy() statt memset() und memcpy() in einer Linux-Umgebung zu benutzen? Ich habe viele sagen, dass sie besser für Linux-Compiler sind, aber keine Vorteile gegenüber den Standardfunktionen gesehen haben.bzero() & bcopy() im Vergleich zu memset() und memcpy()

Sind sie mehr als die Standardoptimierten optimiert, oder haben sie Verhaltenstoleranzen, für die sie bevorzugt werden?

+5

Es gibt genau eine Stelle, an der 'bzero'" besser "ist als' memset': Sie können von einer Funktion, die nur zwei Argumente benötigt, auch auf Architekturen, bei denen jedes Argument einen Stack-Slot beansprucht, "bzero" aufrufen. Was "bcopy" betrifft, so glaube ich, dass es analog zu "memove" und nicht "memcpy" ist. –

+2

'bcmp(), bcopy(), bzero(), ffs()' sind ** nicht ** für neue Anwendungen empfohlen, bei denen Portabilität wichtig ist, sie werden nur für die Portabilität von BSD-Anwendungen bereitgestellt. –

+0

Lies über jeden von [hier] (http://modman.unixdev.net/?sektion=3&page=bzero&manpath=HP-UX-11.11) –

Antwort

40

Die und bcopy Funktionen sind nicht wirklich Standard (ISO) C, sie waren eine POSIX-Sache (in Bezug auf offizielle Standards - in Wirklichkeit haben sie sowohl ISO als auch POSIX vordatiert).

Und beachten Sie, dass Wort „waren“ - sie in POSIX.1-2001 veraltet waren und in POSIX.1-2008 in Ehrerbietung entfernt memset, memcpy und memmove, so sind Sie besser dran, die Standard-C-Funktionen.

Wenn Sie eine Menge Code haben, die sie verwendet, und Sie wollen zu gehen und es nicht zu haben, ändern alle (obwohl Sie wahrscheinlich sollte an einem gewissen Punkt), können Sie die folgenden Schnell Ersetzungen verwenden:

// void bzero(void *s, size_t n); 
#define bzero(s, n) memset((s), 0, (n)) 

// void bcopy(const void *s1, void *s2, size_t n); 
#define bcopy(s1, s2, n) memmove((s2), (s1), (n)) 
1

Eigentlich könnte es heute anders herum sein. Sie sehen, dass, weil memcpy und memset im Standard enthalten ist, der Compiler die Funktion annehmen darf, so dass er genau das tut, was der Standard vorschreibt. Dies bedeutet, dass der Compiler sie durch die effizienteste Art der Durchführung der Operation ersetzen kann. Mit bcopy und bzero andererseits schreibt der Standard kein Verhalten auf diesen vor, so dass der Compiler nichts annehmen kann - was bedeutet, dass der Compiler einen tatsächlichen Funktionsaufruf ausgeben müsste.

Allerdings weiß GCC zum Beispiel über bcopy und bzero, wenn es für ein Betriebssystem, das sie haben, gebaut wird.

+0

Genauer gesagt, einige Compiler (und insbesondere neuere Versionen von [GCC] (http: //gcc.gnu.org /)) kann "memcpy", "memset", "memcmp" auf "magische" Weise (gemäß den Standards) behandeln, z. mit GCC * builtins *, und kann sie besonders optimieren –

2
#include <strings.h> 
void bcopy(const void *src, void *dest, size_t n); 

Beschreibung Die bcopy() Funktion kopiert n Bytes von src nach dest. Das Ergebnis ist korrekt, auch wenn sich beide Bereiche überschneiden.

Entspricht: 4.3BSD, scheint es b kommt von BSD und es scheint veraltet.

Was bedeutet, bkopy ist analog zu memove() nicht memcpy() wie R .. sagte bei seinem Kommentar.

Hinweis: Zeichenfolge s .h ist auch anders als string.h.

+5

BSD hat 'b' Präfixe auf Sachen nicht gesetzt, um ihren Ursprung zu annoncieren. Eigentlich scheint 'b' für" byte "zu stehen. Diese Funktionen werden auf dieser alten Manpage mit "Byte-Strings" (im Gegensatz zu Null-terminierten Textstrings) beschrieben: http://www.tuhs.org/cgi-bin/utree.pl?file=4.1cBSD/usr /man/man3/bstring.3 –

Verwandte Themen