2012-07-14 12 views
13

Ho appena notato il seguente codice in <chrono.h>, che per me non ha senso.VS11 è costante_clock, costante?

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; 

Come può steady_clock essere costante quando deriva semplicemente dal system_clock che non è costante?

risposta

10

Ignorare i bug nell'implementazione di Microsoft per il momento, avere un orologio costante derivato da uno instabile (o monotono da uno non monotono) ha perfettamente senso in generale.

Questo è uno di quei posti che la tipica terminologia "is-a" intralcia, e che invece devi davvero pensare in termini di sostituzione. In particolare, la situazione non è "un orologio costante non è un orologio instabile, quindi la derivazione è sbagliata". Piuttosto, la situazione è "un orologio costante può essere sostituito da un orologio instabile in qualsiasi circostanza, quindi la derivazione va bene" (e allo stesso modo per is_monotonic).

Consideriamo un esempio estremo: avere un orologio atomico collegato direttamente al computer. È monotona e più stabile che puoi sperare di ottenere. Supponendo che il suo output sia abbastanza alto di frequenza (/ risoluzione), potresti usarlo al posto di praticamente ogni/ogni altro orologio che il tuo sistema potrebbe avere a disposizione.

+1

Destra, questa è l'eredità di interfaccia, non implementazione eredità (anche se generalmente in C++ si potrebbe avere entrambi). E un orologio costante soddisfa l'interfaccia di un orologio instabile. –

+0

@ BenVoigt Non credo che "un orologio costante soddisfi l'interfaccia di un orologio instabile". 'system_clock' supporta' from_time_t' e 'to_time_t', che non sono abbastanza significativi per un' steady_clock'. E un 'steady_clock' o' high_resolution_clock' potrebbe non supportare l'intera gamma di 'time_t' (specialmente sulle piattaforme a 32 bit). –

+0

@YongweiWu: Stai confondendo costante vs instabile con tempo relativo rispetto assoluto. –

8

Ignorando il codice che hai mostrato (la risposta di Jerry indirizzi già che meglio di me), presumibilmente VC++ 2012 di std::steady_clock è non costante, come evidenziato da più segnalazioni di bug attualmente aperte sul MS Connect per quanto riguarda questo tema:

8

In realtà non sono d'accordo con la "risposta accettata". È semplicemente sbagliato da parte di Microsoft e può causare aspettative non realistiche. Lo standard C++ 11 richiede system_clock per implementare to_time_t e from_time_t, ma non ci sono tali requisiti per steady_clock e high_resolution_clock. Non è una relazione "è-a", poiché steady_clock non implementa tutte le interfacce richieste di system_clock; né dovrebbe farlo. L'azione di Microsoft non ha senso per me: come ci si può aspettare che lo steady_clock abbia to_time_t mentre si evita il problema dell'asimmetria temporale?

Quindi, in poche parole, Microsoft ha commesso un errore e sono lenti a risolverlo. Secondo Stephan T. Lavavej, "non ha avuto il tempo di sistemare questo nel 2013 RTM" e "tutti gli orologi devono essere reimplementati, come rilevato da diversi bug attivi". Vedi https://connect.microsoft.com/VisualStudio/feedback/details/719443/.

Immagino che non sia stato lui a scrivere la falsa implementazione dell'immondizia all'inizio.

EDIT: Sono un po 'sorpreso di essere stato svalutato, anche un po' turbato. I miei downvoters e disaccordi, ti rendi conto che stai razionalizzando un'implementazione rotta, che potrebbe essere cambiata e risolta presto? Assegnami un nome a un'implementazione reale che ha il numero steady_clock ereditato da system_clock e non è danneggiato ....

FATTO UPDATE nel mese di luglio 2014: A partire dal Visual Studio 2014 CTP2, steady_clock eredita non è più da system_clock ....

+2

Manca nuovamente il punto: mentre 'steady_clock' non ha bisogno di avere' to_time_t', è certamente permesso. E non ci sono restrizioni su come ottenere 'to_time_t'either, quindi anche l'ereditarietà da' system_clock' è OK. – MSalters

+1

@MSalters. Hai perso il punto. Sebbene 'steady_clock' sia autorizzato ad implementare' to_time_t', non ci sono semantiche appropriate. Inoltre, può far sì che le persone scrivano codice non importabile, che viene compilato solo in MSVC, ma non su altre piattaforme, ad esempio se le persone usano veramente 'steady_clock' in cui l'interfaccia richiede un' system_clock &'. –

+1

Una rapida ricerca su Google ha anche rivelato questo link: http://stackoverflow.com/questions/18361638/converting-steady-clocktime-point-to-time-t. Le persone hanno detto cose simili: "' (to | from) _time_t' è significativo solo per gli orologi di sistema.Un 'high_resolution_clock', ad esempio, potrebbe non essere in grado di supportare l'intervallo dell'intero' time_t'. " –

Problemi correlati