Pourquoi la fonction time (time_t *) renvoie-t-elle et définit-elle le by-ref?

J’ai toujours été curieux. Pourquoi la fonction time(time_t *) renvoie-t-elle une valeur time_t et définit-elle l’heure du pointeur passé?

Exemple de retour de l’heure:

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

Exemple de définition de la valeur du pointeur:

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

Au départ, je pensais que l’écriture dans la mémoire serait un gain de performance au lieu de revenir, mais si elle doit faire les deux, cela ne le ralentit-il pas?

La définition actuelle ne présente aucun avantage réel.

Je soupçonne que lorsque la fonction time() été définie pour la première fois, elle utilisait un type qui ne pouvait pas être renvoyé par une fonction. Très tôt, les implémentations C n’avaient pas d’ long int et n’étaient pas capables de renvoyer des structures de fonctions. Sur un système avec 16 bits bits, le seul moyen de représenter une heure serait sous forme de structure ou de tableau; Une valeur de 16 bits en moins d’une journée.

Donc, les premières implémentations de time() auraient peut-être été utilisées comme ceci (spéculation):

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

ou peut-être:

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

Lorsque les implémentations ultérieures de C ont ajouté des entiers plus longs et la possibilité de renvoyer des structures par valeur, la possibilité de renvoyer une valeur time_t partir de la fonction time() été ajoutée, mais l’ancienne fonctionnalité a été conservée pour éviter de casser le code existant.

Je pense que si time() était défini aujourd’hui, cela ressemblerait davantage à ceci:

 time_t time(void); 

Je n’ai pas été en mesure de confirmer que les anciennes implémentations de la fonction time() fonctionnaient de cette façon (essayez de googler “time”!), Mais cela a du sens compte tenu de l’historique du langage.

Si vous passez un pointeur null à la fonction time() , elle renvoie l’heure actuelle sans la stocker également dans une variable. Cela évite une partie de la pénalité de performance:

 time_t now = time(NULL); 

Cela vous permet d’imbriquer un appel à time() dans une autre expression, au lieu de le faire dans une instruction séparée:

 time_t x = time(&now) + more_time; 

Lorsque l’instruction ci-dessus se termine, now devrait contenir l’heure actuelle et x devrait contenir l’heure actuelle plus une valeur.

strcpy tombe dans le même cas car elle renvoie le même pointeur char * qui a été passé en tant que destination, une imbrication est donc également possible:

 printf("Copied ssortingng is %s", strcpy(dst, src));