Время (NULL); vs time (& something);

Реальный простой вопрос. Согласно моей man-странице, эти два будут делать то же самое:

time_t t;
time(&t);

printf("Time: %ld", t);

...

printf("Time: %ld", time(NULL));

Итак, в чем же преимущество передачи указателя на время? В случае отказа time() из-за отсутствия доступных часов ни один из двух вариантов не будет иметь никакой пользы, на мой взгляд.

Ответ 1

Выгода будет заключаться в том, что вам не нужно копировать данные в другую структуру после вызова "времени".

Если вы, например, подготовка буфера данных для отправки другому приложению/серверу вам придется скопировать данные, что является дополнительным издержками. Пропуская указатель в вашу структуру данных, вы можете поместить его в нужное место одним выстрелом.

Конечно, если вы используете только данные для преобразования его в другой формат, такой как текстовый printf, то более эффективно вызывать его с помощью NULL и сохранять дополнительное хранилище, требуемое в первом примере.

Наконец, поскольку функция времени использует одно место для хранения внутренней структуры времени, первый метод был бы более потокобезопасным, хотя я не могу вспомнить о верхней части головы, если "время" на самом деле является безопасным потоком.

Ответ 2

Большинство примеров, которые я видел, проходят NULL. Я также не вижу преимуществ при передаче значащего указателя, тем более что time_t почти всегда является целым типом.

Ответ 3

Из man-страницы:

time_t time (time_t * t);

"Если t не является NULL, возвращаемое значение также будет сохранено в памяти, на которую указывает t."

Я предполагаю, что это просто устаревший материал.

Ответ 4

Указатель на значение time_t, переданное как аргумент функции - IMO - одна из причин существования синтаксиса.

time_t *foo(time_t *dest)
{
     time(dest);
     /* do something with dest here */
     return dest;
}