Реальный простой вопрос. Согласно моей странице справочника, эти два сделают то же:
time_t t;
time(&t);
printf("Time: %ld", t);
...
printf("Time: %ld", time(NULL));
Так, что точно действительно ли преимущество передачи является указателем на время? В случае, если time()
не перестал бы работать ни из-за каких часов, являющихся доступным, ни один из этих двух вариантов не будет обладать никаким преимуществом, по-моему.
Преимущество состоит в том, что вам не нужно копировать данные в другую структуру после вызова time.
Если вы, например, подготовка буфера данных для отправки в другое приложение / сервер, вам придется скопировать данные, что является дополнительными накладными расходами. Передав указатель в свою структуру данных, вы можете сразу поместить его в нужное место.
Конечно, если вы используете данные только для преобразования их в другой формат, такой как текстовый printf, то более эффективно вызывать его с NULL и сохранять дополнительное хранилище, необходимое для вашего первого примера.
Наконец, поскольку функция времени использует одно место для хранения своей внутренней структуры времени, первый метод был бы более потокобезопасным, хотя я не могу вспомнить, что на самом деле «время» является потокобезопасным.
Из man-page:
time_t time(time_t *t);
"If t is non-NULL, return value will also be stored in the memory pointed to by t."
I guess it's just legacy stuff.
Большинство примеров, которые я видел, проходили NULL
. Точно так же я не вижу пользы в передаче значимого указателя, тем более что time_t
почти всегда является просто целочисленным типом.
Указатель на значение time_t, переданный в качестве аргумента функции - ИМО, это одна из причин, по которой существует синтаксис.
time_t *foo(time_t *dest)
{
time(dest);
/* do something with dest here */
return dest;
}