【发布时间】:2019-10-17 09:53:24
【问题描述】:
对于 C++11,C++ 在标准中有一些计时功能。其中一个工具是时钟的标准接口,它基本上允许在调用时钟的now 函数时获取时间。
到目前为止一切都很好,但我看不到 要求 now 成为静态函数的原因。在托管系统上,标准时钟可能仅通过系统调用或通过读取处理器计数器等来实现。但是,这限制了需要维护某些状态的自定义时钟的实现。有了这个接口,要么不能实现某些时钟,要么必须使用全局状态。
我遇到的一个问题基本上是将本地时钟与我从 NTP 服务器获得的时间同步。代码看起来像这样:
class sntp_clock
{
public:
sntp_clock()
: local_time_at_ctor(read_some_cpu_counter())
, sntp_time_at_ctor(read_sntp_time()) {}
sntp_time_t now() const {
return sntp_time_at_ctor + (read_some_cpu_counter() - local_time_at_ctor);
}
/* required types etc */
private:
local_time_t local_time_at_ctor;
sntp_time_t sntp_time_at_ctor;
};
由于我不能使now 静态而不使状态为静态,所以这个时钟不满足C++ 标准中时钟 的要求。但是每个 NTP 服务器都会有不同的状态。
另外,出于效率原因,我可能不想启动 cpu 计数器,但存在时钟实例,但同样,由于 now 是静态的,我无法确切知道何时开始计时,或何时停止计时.
我的问题是为什么时钟有静态now 要求?
注意:当前标准草案要求now为静态:http://eel.is/c++draft/time.clock.req#tab:time.clock
Boost.Chrono 文档有同样的要求:https://www.boost.org/doc/libs/1_63_0/doc/html/chrono/reference.html#chrono.reference.cpp0x.clock
【问题讨论】:
-
@tadman 我认为问题在于问为什么委员会选择以这种方式编写标准。
-
@tadman,我想知道这个决定背后的原因。 技术上所有时钟都有一些状态。只是操作系统正在为您维护该状态。在我们的嵌入式操作系统上,我必须实现时钟,并且我想让它们与 C++ 标准兼容。
-
因为
now函数不使用任何现有的时钟对象来计算“现在”时间?因此它不需要非静态成员函数。它甚至可以是一个非成员函数。 -
@RobertHarvey,我确定 Howard Hinnant 在这里。此外,如果我们得到答案,我想把它放在这里,让其他可能想知道同样问题的人看到。
-
@FatihBAKIR:“事实上,我想知道是否可以在未来的标准中删除限制。”不,它不能。所有期望
Clock编写的模板代码都期望它具有静态now函数。因此会打破一个非静态的。
标签: c++ language-lawyer chrono