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稳?

4

3 回答 3

11

忽略您显示的代码(杰里的答案已经比我更好地解决了这个问题),大概 VC++ 2012std::steady_clock并不稳定,目前在MS Connect上打开的多个错误报告证明了一点:

于 2012-07-14T23:35:56.733 回答
10

暂时忽略 Microsoft 实现中的错误,从不稳定的时钟派生出稳定的时钟(或从非单调的时钟派生出单调的时钟)通常非常有意义。

这是典型的“is-a”术语妨碍的地方之一,您需要真正考虑替代。特别是,情况并非“稳定的时钟不是不稳定的时钟,所以推导是错误的”。相反,情况是“在任何情况下都可以用稳定的时钟代替不稳定的时钟,因此推导很好”(同样适用于is_monotonic)。

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

于 2012-07-15T00:01:23.603 回答
10

我实际上不同意“接受的答案”。这在微软方面是完全错误的,可能会导致不切实际的期望。C++11 标准要求system_clock实现to_time_tand ,但andfrom_time_t没有这样的要求。这不是“is-a”关系,因为没有实现 ; 的所有必需接口。也不应该。微软的行动对我来说没有意义:你怎么能期望一个有,同时避免时间倾斜的问题?steady_clockhigh_resolution_clocksteady_clocksystem_clocksteady_clockto_time_t

所以,简单地说,微软犯了一个错误,他们修复它的速度很慢。根据 Stephan T. Lavavej 的说法,他“没有时间在 2013 年的 RTM 中修复这个问题”,并且“所有的时钟都需要重新实现,正如几个活跃的错误所跟踪的那样”。请参阅https://connect.microsoft.com/VisualStudio/feedback/details/719443/

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

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

2014 年 7 月的事实更新:从Visual Studio 2014 CTP2 开始steady_clock不再继承自system_clock....

于 2013-12-30T10:39:58.930 回答