2012-03-30 10 views
16

Siempre he tenido curiosidad, ¿por qué la función time(time_t *) ambos devuelve un time_t, y establece el tiempo para el puntero pasado?¿Por qué la función time (time_t *) devuelve y configura el by-ref?

Ejemplo de devolver el tiempo:

time_t myTime = time(NULL); 
printf("The time is now %s", ctime(&myTime)); 

Ejemplo de ajuste del valor del puntero:

time_t myTime; 
time(&myTime); 
printf("The time is now %s", ctime(&myTime)); 

originalmente pensé que habría una ganancia de rendimiento de escritura en la memoria en lugar de regresar , pero si tiene que hacer las dos cosas, ¿eso no hace que sea más lento?

Respuesta

16

hay ningún beneficio real en la forma en que está definido actualmente .

Sospecho que cuando se definió por primera vez la función time(), usaba un tipo que no se podía devolver desde una función. Las implementaciones de C muy antiguas no tenían long int y no pudieron devolver estructuras de funciones. En un sistema con 16 bits, la única forma de representar un tiempo sería como una estructura o como una matriz; 16 bits en segundos es menos de un día.

Así primeras implementaciones de time() podrían haber sido utilizados algo como esto (la especulación):

time_t now; 
time(&now); /* sets now.time_high, now.time_low */ 

o tal vez:

int now[2]; 
time_t(now); /* sets now[0], now[1] */ 

Cuando más tarde C implementaciones añaden enteros larga y la capacidad para volver estructuras por valor, se agregó la capacidad de devolver un valor de time_t de la función time(), pero se mantuvo la funcionalidad anterior para evitar la ruptura del código existente.

Creo que si time() se estaban definiendo hoy, se vería más como esto:

time_t time(void); 

no he podido confirmar que las viejas puestas en práctica de la función time() trabajado de esta manera (intente buscar en Google " ¡tiempo "!), pero tiene sentido dada la historia del lenguaje.

Si pasa un puntero nulo a la función time(), devuelve la hora actual sin almacenarla también en una variable; esto evita algunos de los penalización de rendimiento:

time_t now = time(NULL); 
+0

Eso suena plausible. Esperaba que la penalización de rendimiento fuera por el otro lado. Se evita si pasa un NULL, pero si lo llama con un puntero e ignora el resultado de la devolución, todavía tiene que meter el tiempo en el registro de devolución. A veces olvido que C tiene casi el doble de edad que yo. :) – wjl

+2

* A veces olvido que C tiene casi el doble de edad que yo. * - ¡Gracias por hacerme sentir viejo! 8-)} –

7

Le permite a anidar una llamada a time() dentro de otra expresión, en lugar de hacerlo en una declaración por separado:

time_t x = time(&now) + more_time; 

Cuando termina la declaración anterior, now debe contener la hora actual, y x debe contener el tiempo actual más algún valor.

strcpy cae en el mismo caso, ya que devuelve el mismo char * puntero que ha sido aprobada como su destino, por lo que anida es posible así:

printf("Copied string is %s", strcpy(dst, src)); 
+3

Si 'tiempo()' tomó sin argumentos, que podría fácilmente ser hechas por los nidos de una asignación: 'time_t x = (ahora = time())' + more_time ; ' –

+3

Aunque estoy de acuerdo con Keith, esta respuesta es la primera que he visto para proporcionar un posible uso conveniente para la firma extraña de 'time' ... –

+0

Creo que en ambos casos sería mejor usar dos líneas por el bien de la legibilidad. Probablemente se compila de la misma manera en ambos sentidos. – wjl

Cuestiones relacionadas