2012-07-14 5 views
13

Acabo de notar el siguiente código en <chrono.h>, que no tiene sentido para mí.VS11 es steady_clock, estable?

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; 

¿Cómo puede steady_clock ser constante cuando simplemente se deriva de system_clock que no es estable?

Respuesta

10

Ignorar errores en la implementación de Microsoft por el momento, tener un reloj continuo derivado de uno inestable (o uno monotónico derivado de uno no monótono) tiene un buen sentido en general.

Este es uno de esos lugares en los que la típica terminología "is-a" se interpone en el camino, y realmente necesita pensar en términos de sustitución. En particular, la situación no es "un reloj constante no es un reloj inestable, por lo que la derivación es incorrecta". Por el contrario, la situación es "un reloj constante puede ser sustituido por un reloj inestable bajo ninguna circunstancia, por lo que la derivación es buena" (y del mismo modo para is_monotonic).

Consideremos un ejemplo extremo: tener un reloj atómico conectado directamente a su computadora. Es monótono y casi tan constante como puedes esperar. Suponiendo que su salida sea lo suficientemente alta frecuencia (/ resolución), podría usarla en lugar de esencialmente cualquier otro reloj que su sistema pueda tener disponible.

+1

derecho, esto es herencia de interfaces, no la herencia de implementación (aunque por lo general en C++ es posible que tenga ambos). Y un reloj constante satisface la interfaz de un reloj inestable. –

+0

@BenVoigt No creo que "un reloj estable satisfaga la interfaz de un reloj inestable". 'system_clock' admite' from_time_t' y 'to_time_t', que no son muy significativos para' steady_clock'. Y un 'steady_clock' o' high_resolution_clock' puede no ser compatible con el rango completo de 'time_t' (especialmente en plataformas de 32 bits). –

+0

@YongweiWu: Estás confundiendo constante vs inestable con tiempo relativo vs absoluto. –

8

Ignorando el código que has demostrado (respuesta de Jerry ya las direcciones que mejor que yo), presumiblemente VC++ de std::steady_clock es 2012 no constante, como lo demuestran los múltiples informes de errores abiertos actualmente en MS Connect con respecto a este mismo tema:

8

En realidad, no estoy de acuerdo con la "respuesta aceptada". Es puramente incorrecto en el lado de Microsoft, y puede causar expectativas poco realistas. El estándar C++ 11 requiere system_clock para implementar to_time_t y from_time_t, pero no existen tales requisitos para steady_clock y high_resolution_clock. No es una relación "is-a", ya que steady_clock no implementa todas las interfaces requeridas de system_clock; ni debería. La acción de Microsoft no tiene sentido para mí: ¿cómo se puede esperar que steady_clock tenga to_time_t mientras se evita el problema de la inclinación del tiempo?

En pocas palabras, Microsoft cometió un error y tardan en solucionarlo. Según Stephan T. Lavavej, "no tuvo tiempo de arreglar esto en 2013 RTM", y "todos los relojes deben ser reimplantados, como rastreado por varios errores activos". Ver https://connect.microsoft.com/VisualStudio/feedback/details/719443/.

Supongo que no fue él quien escribió la implementación de la basura falsa al principio.

EDIT: Estoy un poco sorprendido de que haya votado negativamente, incluso un poco molesto. Mis downvoters y desacuerdos, ¿te das cuenta de que estás racionalizando una implementación fallida, que puede ser cambiada y arreglada pronto? Llámame una implementación real que tiene steady_clock hereda de system_clock y no está rota ....

ACTUALIZACIÓN DE DATOS en julio de 2014: A partir de Visual Studio 2014 CTP2, steady_clock ya no se hereda de system_clock ....

+2

Perdiendo el punto de nuevo: mientras 'steady_clock' no necesita tener' to_time_t', ciertamente está permitido. Y no hay restricciones sobre cómo se obtiene 'to_time_t'either, por lo que la herencia de' system_clock' también está bien. – MSalters

+1

@MSalters. Te perdiste el punto. Aunque 'steady_clock' tiene permitido implementar' to_time_t', no hay semántica adecuada. Además, puede hacer que las personas escriban código no compatible, que compila solo en MSVC, pero no en otras plataformas, por ejemplo, si la gente realmente usa 'steady_clock' en donde la interfaz requiere' 'system_clock &'. –

+1

Una búsqueda rápida en Google también reveló este enlace: http://stackoverflow.com/questions/18361638/converting-steady-clocktime-point-to-time-t. La gente dijo cosas similares: "' (to | from) _time_t' solo tiene sentido para los relojes del sistema. Un 'high_resolution_clock', por ejemplo, puede no ser compatible con el rango de todo' time_t'. " –

Cuestiones relacionadas