2012-07-14 41 views
13

Tôi chỉ nhận thấy mã sau đây trong <chrono.h>, điều này không có ý nghĩa đối với tôi.VS11 ổn định, ổn định?

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; 

Làm thế nào có thể steady_clock được ổn định khi nó chỉ đơn giản xuất phát từ system_clock mà không phải là ổn định?

Trả lời

10

Bỏ qua các lỗi trong quá trình thực hiện của Microsoft cho thời điểm này, có một đồng hồ ổn định xuất phát từ một cái không ổn định (hoặc một cái đơn điệu xuất phát từ một cái không đơn điệu).

Đây là một trong những địa điểm mà thuật ngữ "chính là" điển hình bị cản trở và bạn cần thực sự nghĩ về mặt thay thế. Đặc biệt, tình hình không phải là "một đồng hồ ổn định không phải là một chiếc đồng hồ không ổn định, do đó, dẫn xuất là sai." Thay vào đó, tình hình là "một đồng hồ ổn định có thể được thay thế cho một chiếc đồng hồ không ổn định trong bất kỳ trường hợp nào, do đó dẫn xuất là tốt" (và tương tự như vậy cho is_monotonic).

Hãy xem xét một ví dụ cực đoan - có đồng hồ nguyên tử được kết nối trực tiếp với máy tính của bạn. Nó đơn điệu và ổn định như bạn có thể hy vọng có được. Giả sử đầu ra của nó là tần số đủ cao (/ độ phân giải), bạn có thể sử dụng nó thay cho bất kỳ/đồng hồ nào khác mà hệ thống của bạn có thể có sẵn.

+1

Đúng vậy, đây là giao diện thừa kế, không thực hiện thừa kế (mặc dù thường trong C++ bạn có thể có cả hai). Và một chiếc đồng hồ ổn định thỏa mãn giao diện của một chiếc đồng hồ không ổn định. –

+0

@BenVoigt Tôi không nghĩ rằng "một đồng hồ ổn định thỏa mãn giao diện của một chiếc đồng hồ không ổn định". 'system_clock' hỗ trợ' from_time_t' và 'to_time_t', điều này không có ý nghĩa đối với' stable_clock'. Và 'stable_clock' hoặc' high_resolution_clock' có thể không hỗ trợ đầy đủ 'time_t' (đặc biệt trên nền tảng 32 bit). –

+0

@YongweiWu: Bạn đang bối rối ổn định và không ổn định với thời gian tương đối so với tuyệt đối. –

8

Bỏ qua đoạn code bạn đã thể hiện (câu trả lời Jerry đã đề cập đến điều đó tốt hơn tôi có thể), có lẽ VC++ năm 2012 std::steady_clock được không ổn định, bằng chứng là nhiều báo cáo lỗi hiện đang mở trên MS Connect về vấn đề này rất:

8

Tôi thực sự không đồng ý với "câu trả lời được chấp nhận". Nó hoàn toàn sai về phía Microsoft, và có thể gây ra những kỳ vọng không thực tế. Tiêu chuẩn C++ 11 yêu cầu system_clock để triển khai to_time_tfrom_time_t, nhưng không yêu cầu như vậy đối với steady_clockhigh_resolution_clock. Đó không phải là mối quan hệ "là-a", vì steady_clock không triển khai tất cả các giao diện bắt buộc của system_clock; cũng không nên. Hành động của Microsoft không có ý nghĩa với tôi: Làm thế nào bạn có thể mong đợi một steady_clockto_time_t trong khi tránh vấn đề lệch thời gian?

Vì vậy, chỉ cần đặt, Microsoft đã thực hiện một sai lầm, và họ đang làm chậm để sửa chữa nó. Theo Stephan T. Lavavej, ông "không có thời gian để sửa lỗi này trong năm 2013 RTM", và "tất cả các đồng hồ cần phải được reimplemented, theo dõi bởi một số lỗi hoạt động". Xem https://connect.microsoft.com/VisualStudio/feedback/details/719443/.

Tôi đoán đó không phải là anh ấy đã viết triển khai giả rác ngay từ đầu.

EDIT: Tôi hơi ngạc nhiên khi tôi bị giảm giá, thậm chí một chút khó chịu. Những kẻ phản đối và không đồng ý của tôi, bạn có nhận ra rằng bạn đang hợp lý hoá việc triển khai bị hỏng, có thể được thay đổi và sửa chữa sớm không? Đặt tên cho tôi là một triển khai thực sự có steady_clock được kế thừa từ system_clock và không bị hỏng ....

FACT UPDATE trong tháng 7 năm 2014: Tính đến Visual Studio 2014 CtP2 tháng, steady_clock không còn được thừa hưởng từ system_clock ....

+2

Thiếu điểm một lần nữa: trong khi 'stable_clock' không cần phải có' to_time_t', nó chắc chắn được cho phép. Và không có giới hạn về cách nó được 'to_time_t'either, do đó, kế thừa từ' system_clock' là OK quá. – MSalters

+1

@MSalters. Bạn đã bỏ lỡ điểm. Mặc dù 'stable_clock' được phép thực hiện' to_time_t', không có ngữ nghĩa phù hợp. Hơn nữa, nó có thể làm cho mọi người viết mã không thể chuyển đổi, mà chỉ biên dịch trong MSVC, nhưng không phải trên các nền tảng khác - ví dụ, nếu mọi người thực sự sử dụng 'steady_clock' ở nơi giao diện yêu cầu' system_clock & '. –

+1

Tìm kiếm nhanh trên Google cũng tiết lộ liên kết này: http://stackoverflow.com/questions/18361638/converting-steady-clocktime-point-to-time-t. Mọi người nói những điều tương tự: "' (to | from) _time_t' chỉ có ý nghĩa đối với đồng hồ hệ thống. Ví dụ: 'high_resolution_clock' có thể không hỗ trợ phạm vi của toàn bộ' time_t'. " –

Các vấn đề liên quan