2012-03-30 10 views
16

Мне всегда было любопытно, почему функция time(time_t *) возвращает time_t и задает время переданному в указателе?Почему функция time (time_t *) возвращает и возвращает by-ref?

Пример возвращения времени:

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

Пример установки значения указателя:

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

Первоначально я думал, что будет прирост производительности путем записи в память, а не возвращаться , но если он должен сделать то и другое, разве это не делает его медленнее?

ответ

16

Там нет никакой реальной пользы в том, как это определено в настоящее время ,

Я подозреваю, что когда функция time() была определена впервые, она использовала тип, который не может быть возвращен функцией. В очень ранних реализациях C не было long int и они не смогли вернуть структуры из функций. В системе с 16-битными ints единственным способом представления времени будет структура или массив; 16 бит на секунды меньше, чем на один день.

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

или возможно::

Так ранние реализации time() могли быть что-то вроде этого (спекуляции) использовали

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

Когда позже реализации C добавляют более длинные целые числа, а также возможность возврата структур по значению добавлена ​​возможность вернуть значение time_t из функции time(), но старые функции были сохранены, чтобы избежать нарушения существующего кода.

Я думаю, что если time() были определены сегодня, это будет выглядеть следующим образом:

time_t time(void); 

Я не был в состоянии подтвердить, что старые реализации функции time() работала таким образом (попробуйте погуглить " время "!), но это имеет смысл, учитывая историю языка.

Если вы передаете нулевой указатель на функцию time(), он возвращает текущее время без сохранения его в переменной; это позволяет избежать некоторых потерь производительности:

time_t now = time(NULL); 
+0

Это звучит правдоподобно. Я ожидал, что штраф за исполнение будет идти другим путем. Этого избегают, если вы передаете NULL, но если вы вызываете его указателем и игнорируете результат возврата, ему все равно нужно засунуть время в регистр возврата. Иногда я забываю, что C почти в два раза старше меня. :) – wjl

+2

* Иногда я забываю, что C почти в два раза старше меня. * - Спасибо, что заставил меня чувствовать себя старым! 8-)} –

7

Это позволяет гнездиться вызов time() внутри другого выражения, вместо того, чтобы делать это в отдельном заявлении:

time_t x = time(&now) + more_time; 

Когда вышеприведенное утверждение заканчивается, now должна содержать текущее время, и x должен содержать текущее время плюс некоторое значение.

strcpy падает в том же случае, поскольку она возвращает тот же char * указатель, который был принят в качестве места назначения, поэтому вложенности можно так:

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

Если 'времени()' не предпринимал никаких аргументов, которые могли бы быть столь же легко сделать, вкладывая задание: 'time_t х = (теперь = время())' + more_time ; ' –

+3

Пока я согласен с Кейтом, этот ответ является первым, что я видел, чтобы предоставить потенциальное удобное использование для нечетной подписи' time' ... –

+0

Я думаю, что в обоих случаях было бы лучше использовать две строки для удобства чтения. Вероятно, он скомпрометирует одно и то же. – wjl