我一直很好奇,为什么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));
我最初认为写入内存而不是返回会提高性能,但如果它必须同时执行这两项操作,那岂不是只会让速度变慢吗?
最佳答案
目前定义它的方式并没有真正的好处。
我怀疑当第一次定义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()
函数返回 time_t
值的能力,但是保留旧功能以避免破坏现有代码。
我认为如果今天定义 time()
,它看起来会更像这样:
time_t time(void);
我无法确认 time()
函数的旧实现是否以这种方式工作(尝试使用谷歌搜索“time”!),但考虑到该语言的历史,这是有道理的。
如果您将空指针传递给 time()
函数,它会返回当前时间而不会将其存储在变量中;这避免了一些性能损失:
time_t now = time(NULL);
更新
早期的 UNIX 源代码在 https://github.com/dspinellis/unix-history-repo 中可用。
查看 Research-V6
git 标签,time()
系统调用的手册页位于 usr/doc/man/man2/time .2
。它是以 *roff 的过时形式编写的,但这是我对它进行格式化的尝试。 (用 PDP-11 汇编语言编写并可从 C 调用的实现位于 usr/source/s2/time.s
中。)
当时 C 没有 void
函数。没有声明返回类型的函数默认返回 int
。我不清楚 time
函数会返回什么,但我的猜测是它将是 32 位值的高位 16 位字。截至手册页上的日期,该时间约为 1730,以 216 秒 (18h12m16s) 为单位。正确编写的 C 代码不会尝试使用返回值。
时间 8/5/73
名字
time - 获取日期和时间
概要
(time = 13.)
sys time
time(tvec)
int tvec[2]
描述
Time 返回返回自 1970 年 1 月 1 日格林威治标准时间 00:00:00 以来的测量时间 片刻之间。从 as 开始,高位字在 r0 寄存器中,并且 低位在 r1 中。从 C 中,填充了用户提供的 vector 。
另见
日期(I)、时间(II)、时间(III)
关于c - 为什么 time(time_t *) 函数既返回又设置 by-ref?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9944771/