Подтвердить что ты не робот

Почему функция time (time_t *) возвращает и возвращает значение by-ref?

Мне всегда было интересно, почему функция time(time_t *) возвращает a 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));

Я изначально думал, что будет увеличение производительности за счет записи в память вместо возврата, но если это необходимо сделать, разве это не делает это медленнее?

4b9b3361

Ответ 1

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

Я подозреваю, что когда функция time() была впервые определена, она использовала тип, который нельзя было вернуть из функции. У очень ранних реализаций C не было long int и они не смогли вернуть структуры из функций. В системе с 16-битными ints единственным способом представления времени будет структура или массив; 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);

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

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

time_t now = time(NULL);

Ответ 2

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

time_t x = time(&now) + more_time;

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

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

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