c - 为什么 time(time_t *) 函数既返回又设置 by-ref?

标签 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));

我最初认为写入内存而不是返回会提高性能,但如果它必须同时执行这两项操作,那岂不是只会让速度变慢吗?

最佳答案

目前定义它的方式并没有真正的好处。

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

相关文章:

c - 函数调用的参数太少,并且类型冲突 C

c++ - 如何在字节数组中搜索 "n bits"?

c++ - Tokyo Cabinet : Segmentation fault at hdb->close()

c - 如何从 struct tm 中生成人类可读的字符串?

c - 调用 clock_gettime() 时,返回的 tv_nsec 字段实际上可能超过一秒吗?

c - 初始化多维数组

java - 使用 toString 方法在 java 中仅显示日期

java - 从 Unix Epoch 转换为 Java 中的日期和时间

linux - mtd-utils 2.0.0.1 配置 : error: lzo missing

Ubuntu 找不到 glibc2.14