2013-08-20 27 views
32

C'è qualche ragione per usare la non-standard bzero() e bcopy() invece di memset() e memcpy() in ambiente Linux? Ho sentito molti dire che sono migliori per i compilatori Linux, ma non hanno visto alcun vantaggio rispetto alle funzioni standard.Bzero() e bcopy() contro memset() e memcpy()

Sono più ottimizzati rispetto a quelli standard o hanno qualche particolarità comportamentale per la quale sono preferiti?

+5

C'è esattamente un posto in cui 'bzero' è" migliore "di" memset': puoi tail-call a 'bzero' da una funzione che accetta solo 2 argomenti anche su architetture in cui ogni argomento occupa uno slot di stack. Per quanto riguarda 'bcopy', credo che sia analogo a' memmove', non 'memcpy'. –

+2

'bcmp(), bcopy(), bzero(), ffs()' sono ** non ** raccomandato per le nuove applicazioni in cui la portabilità è importante, sono fornite esclusivamente per la portabilità delle applicazioni BSD. –

+0

Leggi di più da [qui] (http://modman.unixdev.net/?sektion=3&page=bzero&manpath=HP-UX-11.11) –

risposta

40

Le funzioni bzero e bcopy non sono in realtà standard (ISO) C, erano una cosa POSIX (in termini di standard ufficiali - in realtà erano pre-datate sia ISO che POSIX).

e si noti che la parola "erano" - sono stati deprecati in POSIX.1-2001 e rimossi in POSIX.1-2008 per rispetto memset, memcpy e memmove, quindi è meglio usare le funzioni standard C.

Se si dispone di un sacco di codice che li utilizza e non si vuole avere di andare a cambiare tutto (anche se probabilmente dovrebbe ad un certo punto), è possibile utilizzare i seguenti sostituzioni veloci:

// 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

In realtà oggi potrebbe essere il contrario. Vedete che poiché lo standard memcpy e memset è incluso nello standard, al compilatore sarà consentito assumere che la funzione chiamata così fa esattamente ciò che lo standard prescrive. Ciò significa che il compilatore può sostituirli con il modo più efficiente di eseguire l'operazione che può capire. Con bcopy e bzero d'altra parte lo standard non prescrive alcun comportamento su quelli in modo che il compilatore non possa assumere nulla - il che significa che il compilatore dovrebbe emettere una chiamata di funzione effettiva.

Tuttavia GCC ad esempio conosce bcopy e bzero se è stato creato per un sistema operativo che li ha.

+0

Più precisamente, alcuni compilatori (e in particolare versioni recenti di [GCC] (http: //gcc.gnu.org /)) può gestire 'memcpy',' memset', 'memcmp' in un modo" magico "(conforme agli standard), ad es. con GCC * builtins *, e può ottimizzarli appositamente –

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

Descrizione Il bcopy() funzione copia n byte da src a dest. Il risultato è corretto, anche quando entrambe le aree si sovrappongono.

Conforme a: 4.3BSD, sembra che b provenga da BSD e sembra deprecato.

Ciò significa che bcopy è analogo a memmove() not memcpy() come R .. ha detto al suo commento.

Nota: la stringa s .h è anche diversa da string.h.

+5

BSD non ha inserito prefissi 'b' su cose per pubblicizzare la loro origine. In realtà il 'b' sembra stare per" byte ". Queste funzioni sono descritte come operanti su "stringhe di byte" (in contrasto con stringhe di testo con terminazione null) in questa pagina man old: http://www.tuhs.org/cgi-bin/utree.pl?file=4.1cBSD/usr /man/man3/bstring.3 –