2010-05-28 13 views
10

Vera domanda semplice. Secondo il mio uomo-page, questi due faranno lo stesso:time (NULL); vs tempo (e qualcosa);

time_t t; 
time(&t); 

printf("Time: %ld", t); 

...

printf("Time: %ld", time(NULL)); 

Quindi, qual è esattamente il vantaggio di passare un puntatore a tempo? Nel caso in cui il time() fallirebbe a causa della mancanza di orologio disponibile, nessuna delle due varianti avrà alcun beneficio a mio parere.

risposta

8

Il vantaggio sarebbe che non è necessario copiare i dati in un'altra struttura dopo aver chiamato "ora".

Se si è ad esempio preparando un buffer di dati da inviare a un'altra applicazione/server, dovresti copiare i dati, che è un overhead aggiuntivo. Passando un puntatore nella tua struttura dati, potresti metterlo nel posto giusto in un colpo solo.

Naturalmente se l'unico utilizzo per i dati è convertirlo in un altro formato, ad esempio un testo printf, è più efficiente chiamarlo con NULL e salvare la memoria aggiuntiva richiesta dal primo esempio.

Infine, poiché la funzione del tempo utilizza una singola posizione per la memorizzazione della sua struttura temporale interna, il primo metodo sarebbe più sicuro per i thread, anche se non ricordo la parte superiore della mia testa se "time" è effettivamente thread-safe.

0

Dall'uomo-page:

tempo time_t (time_t * t);

"Se t è non NULL, anche il valore di ritorno verrà memorizzato nella memoria indicata da t."

Immagino che sia solo roba legacy.

+1

L'OP ottiene questo. Chiede _why_ che tu voglia passare un puntatore non NULL. –

1

La maggior parte degli esempi ho visto passare NULL. Allo stesso modo non vedo alcun vantaggio nel passare un puntatore significativo, specialmente dal momento che lo time_t è praticamente sempre un tipo integrale.

0

Puntatore al valore time_t passato come argomento di funzione - IMO è uno dei motivi per cui esiste la sintassi.

time_t *foo(time_t *dest) 
{ 
    time(dest); 
    /* do something with dest here */ 
    return dest; 
}