Почему функция time (time_t *) возвращает и устанавливает by-ref? - PullRequest
16 голосов
/ 30 марта 2012

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

Пример возврата времени:

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));

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

Ответы [ 2 ]

16 голосов
/ 30 марта 2012

Нет реального преимущества в том, как оно определено в настоящее время.

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

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

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

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

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

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

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

time_t time(void);

Я не смог подтвердить, что старые реализации *Функция 1022 * работала таким образом (попробуйте поискать «время»!), Но это имеет смысл, учитывая историю языка.

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

time_t now = time(NULL);
7 голосов
/ 30 марта 2012

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

time_t x = time(&now) + more_time;

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

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

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