为什么time(time_t *)函数都返回并设置by-ref?

时间:2012-03-30 14:20:17

标签: c time libc

我一直很好奇,为什么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 个答案:

答案 0 :(得分:16)

目前定义的方式没有任何实际好处。

我怀疑当第一次定义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);

我无法确认time()函数的旧实现是否以这种方式工作(尝试使用Google搜索“时间”!),但考虑到语言的历史,这是有道理的。

如果将空指针传递给time()函数,它将返回当前时间而不将其存储在变量中;这避免了一些性能损失:

time_t now = time(NULL);

答案 1 :(得分:7)

它允许您在另一个表达式中嵌套对time()的调用,而不是在单独的语句中执行:

time_t x = time(&now) + more_time;

上述声明完成后,now应包含当前时间,x应包含当前时间加上一些值。

strcpy属于同一种情况,因为它返回已作为目标传递的相同char *指针,因此也可以嵌套它:

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