2012-07-14 13 views
13

मैंने अभी निम्न कोड <chrono.h> में देखा है, जो मुझे समझ में नहीं आता है।वीएस 11 स्थिर_clock है, स्थिर?

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 जो स्थिर नहीं है से निकला है?

उत्तर

10

इस समय के लिए माइक्रोसॉफ्ट के कार्यान्वयन में बग को अनदेखा करते हुए, एक स्थिर घड़ी को एक अस्थिर व्यक्ति से प्राप्त होता है (या एक गैर-मोनोटोनिक एक से प्राप्त एक मोनोटोनिक) सामान्य रूप से पूरी तरह से अच्छी समझ में आता है।

यह उन स्थानों में से एक है जहां ठेठ "एक-" शब्दावली रास्ते में आती है, और आपको इसके बजाय प्रतिस्थापन के संदर्भ में वास्तव में सोचने की आवश्यकता है। विशेष रूप से, स्थिति नहीं है "एक स्थिर घड़ी एक अस्थिर घड़ी नहीं है, इसलिए व्युत्पन्न गलत है।" इसके बजाय, स्थिति "किसी भी परिस्थिति में एक अस्थिर घड़ी के लिए एक स्थिर घड़ी को प्रतिस्थापित किया जा सकता है, इसलिए व्युत्पन्न ठीक है" (और इसी प्रकार is_monotonic के लिए)।

चलो एक चरम उदाहरण पर विचार करें - एक परमाणु घड़ी सीधे आपके कंप्यूटर से जुड़ा हुआ है। यह एकान्त और स्थिर है जितना आप प्राप्त करने की उम्मीद कर सकते हैं। अपने आउटपुट को मानना ​​पर्याप्त आवृत्ति (/ संकल्प) है, आप इसे अपने सिस्टम के उपलब्ध होने वाली अनिवार्य रूप से किसी भी अन्य घड़ी के स्थान पर उपयोग कर सकते हैं।

+1

अधिकार से विरासत, इस इंटरफेस विरासत, नहीं कार्यान्वयन विरासत (हालांकि सी में आम तौर पर ++ आप हो सकता है दोनों)। और एक स्थिर घड़ी एक अस्थिर घड़ी के इंटरफ़ेस को संतुष्ट करती है। –

+0

@BenVoigt मुझे नहीं लगता कि "एक स्थिर घड़ी एक अस्थिर घड़ी के इंटरफ़ेस को संतुष्ट करती है"। 'system_clock' '________'' '____ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ और 'steady_clock' या 'high_resolution_clock'' time_t' (32-बिट प्लेटफॉर्म पर esp।) की पूरी श्रृंखला का समर्थन नहीं कर सकता है। –

+0

@ योंगवेई: आप रिश्तेदार बनाम पूर्ण समय के साथ स्थिर बनाम अस्थिर भ्रमित कर रहे हैं। –

8

कोड आप दिखाया है की उपेक्षा (जैरी जवाब पहले से ही है कि मैं कर सकता की तुलना में बेहतर के पते), शायद कुलपति ++ 2012 के std::steady_clock है नहीं स्थिर, कई बग रिपोर्ट वर्तमान में MS Connect पर खुला यह बहुत ही इस मुद्दे के बारे में इसका सबूत के रूप में:

8

मैं वास्तव में "स्वीकृत उत्तर" से सहमत नहीं हूं। यह माइक्रोसॉफ्ट पक्ष पर पूरी तरह से गलत है, और अवास्तविक उम्मीदों का कारण बन सकता है। to_time_t और from_time_t को लागू करने के लिए सी ++ 11 मानक system_clock की आवश्यकता है, लेकिन steady_clock और high_resolution_clock के लिए ऐसी कोई आवश्यकता नहीं है। यह "is-a" रिश्ते नहीं है, क्योंकि steady_clocksystem_clock के सभी आवश्यक इंटरफेस को लागू नहीं करता है; न ही यह चाहिए। माइक्रोसॉफ्ट की कार्रवाई मुझे समझ में नहीं आती है: समय की स्कूइंग की समस्या से बचने के दौरान steady_clock में to_time_t की उम्मीद कैसे हो सकती है?

तो, बस डालें, माइक्रोसॉफ्ट ने गलती की है, और वे इसे ठीक करने में धीमे हैं। स्टीफन टी। Lavavej के अनुसार, "2013 आरटीएम में इसे ठीक करने के लिए समय नहीं था", और "सभी घड़ियों को कई सक्रिय बग द्वारा ट्रैक के रूप में, फिर से कार्यान्वित करने की जरूरत है"। https://connect.microsoft.com/VisualStudio/feedback/details/719443/ देखें।

मुझे लगता है कि यह वह नहीं था जिसने शुरुआत में बकवास नकली कार्यान्वयन लिखा था।

संपादित करें: मुझे आश्चर्य है कि मैं थोड़ी परेशान भी हो गई थी। मेरे डाउनवॉटर और असहमत, क्या आपको एहसास है कि आप एक टूटी हुई कार्यान्वयन को तर्कसंगत बना रहे हैं, जिसे जल्द ही बदला जा सकता है और तय किया जा सकता है? मुझे एक वास्तविक कार्यान्वयन नाम दें जिसमें steady_clocksystem_clock से उत्तराधिकारी है और टूटा नहीं है ....जुलाई 2014 के

तथ्य अद्यतन: दृश्य स्टूडियो के रूप में 2014 CTP2, steady_clock अब system_clock ....

+2

फिर से बिंदु को याद कर रहा है: जबकि 'steady_clock' को' to_time_t' होने की आवश्यकता नहीं है, तो निश्चित रूप से इसकी अनुमति है। और इस पर कोई प्रतिबंध नहीं है कि यह 'to_time_t' क्यों मिलता है, इसलिए 'system_clock' से विरासत भी ठीक है। – MSalters

+1

@MSalters। आप बिंदु चूक गए। हालांकि 'to_time_t' को लागू करने के लिए' steady_clock' की अनुमति है, लेकिन कोई उपयुक्त अर्थशास्त्र नहीं है। और भी, यह लोगों को असंगत कोड लिख सकता है, जो केवल एमएसवीसी में संकलित करता है, लेकिन अन्य प्लेटफार्मों पर नहीं - उदाहरण के लिए, यदि लोग वास्तव में 'steady_clock' का उपयोग करते हैं जहां इंटरफ़ेस को 'system_clock &' की आवश्यकता होती है। –

+1

एक त्वरित Google खोज ने यह लिंक भी प्रकट किया: http://stackoverflow.com/questions/18361638/converting-steady-clocktime-point-to-time-t। लोगों ने समान बातें कहा: "' (से | से) _time_t' केवल सिस्टम घड़ियों के लिए सार्थक है। उदाहरण के लिए, 'high_resolution_clock'' पूरे 'time_t' की सीमा का समर्थन करने में सक्षम नहीं हो सकता है।" –

संबंधित मुद्दे