VS11稳定锁定,稳定

VS11 is steady_clock, steady?

本文关键字:稳定 锁定 VS11      更新时间:2023-10-16

我刚刚注意到<chrono.h>中的以下代码,这对我来说没有意义。

struct system_clock
{
    static const bool is_monotonic = false; // retained
    static const bool is_steady = false;
};
class steady_clock
    : public system_clock
    {   // wraps monotonic clock
public:
    static const bool is_monotonic = true;  // retained
    static const bool is_steady = true;
    };
typedef steady_clock monotonic_clock;   // retained
typedef system_clock high_resolution_clock;

steady_clock简单地从不稳定的system_clock导出时,它如何稳定?

忽略您显示的代码(Jerry的回答已经比我更好地解决了这一问题),可能VC++2012的std::steady_clock不稳定的,MS Connect上当前打开的关于这个问题的多个错误报告证明了这一点:

  • steady_clock类和clock()函数不符合C++11和C11标准
  • [C++]std::chrono::steady_clock不稳定
  • (可能相关)C++标头的high_resolution_clock没有高分辨率

暂时忽略微软实现中的错误,让一个稳定的时钟从一个不稳定的时钟中派生出来(或者让一个单调的时钟从非单调的时钟派生出来)通常是非常有意义的。

这是典型的"is-a"术语所阻碍的地方之一,你需要真正从替代的角度来思考。特别是,这种情况不是"稳定的时钟不是非稳定的时钟,所以推导是错误的"。相反,这种情况是"在任何情况下,稳定的时钟都可以代替非稳定的钟,所以推导很好"(is_monotonic也是如此)。

让我们考虑一个极端的例子——将原子钟直接连接到您的计算机。它是单调的,并且尽可能稳定。假设它的输出足够高的频率(/分辨率),您可以使用它来代替系统可能有的任何/每一个其他时钟。

我实际上不同意"接受的答案"。这完全是微软方面的错误,可能会引起不切实际的期望。C++11标准要求system_clock实现to_time_tfrom_time_t,但对steady_clockhigh_resolution_clock没有这样的要求。它不是"is-a"关系,因为steady_clock并没有实现system_clock所需的所有接口;微软的行动对我来说毫无意义:你怎么能指望steady_clockto_time_t,同时避免时间偏移的问题?

所以,简单地说,微软犯了一个错误,他们修复它的速度很慢。根据Stephan T.Lavavej的说法,他"在2013 RTM中没有时间修复这个问题","所有的时钟都需要重新实现,因为有几个活跃的bug在跟踪"。看见https://connect.microsoft.com/VisualStudio/feedback/details/719443/.

我想一开始并不是他写的垃圾假实现。

编辑:我有点惊讶,我被否决了,甚至有点沮丧。我的悲观选民和反对者,你意识到你在为一个可能很快就会改变和修复的支离破碎的实施合理化吗?给我举一个真正的实现,它的steady_clock继承自system_clock,并且没有中断。。。。

2014年7月的事实更新:自Visual Studio 2014 CTP2起,steady_clock不再继承自system_clock。。。。