Several questions about header in C++ 11

前端 未结 2 1842
借酒劲吻你
借酒劲吻你 2021-02-14 14:34

I have several questions about new header in C++ 11. Using Windows 7, Visual Studio 2012.

Looking at the example http://en.cppreference.com/w

2条回答
  •  故里飘歌
    2021-02-14 15:07

    1. Correct

      According to the standard:

      system_clock represent[s] wall clock time from the system-wide realtime clock.

      The library does not provide a mechanism for measuring CPU time, so if you want that you'll have to fall back on the old library and use std::clock().

      (And if you're targeting Windows you'll have to fall back on whatever platform-specific API Windows provides for getting CPU time since, as you point out, their std::clock() doesn't work correctly.)

      system_clock is more like a counterpart to std::time() than to std::clock(). (E.g., note that system_clock provides conversions between system_clock::time_points and time_t.) I imagine that the lack of a clock in for measuring CPU time is due to time constraints on the standard committee and the fact that that functionality is less used than the system's wall clock and real-time clocks.

      If you want CPU time but also want the benefits that provides, you should implement a clock type that conforms to the Clock concept outlined in the standard and which provides CPU time, perhaps implemented internally using std::clock().

    2. The line that says

      int elapsed_seconds = std::chrono::duration_cast
                          (end-start).count();
      

      is what causes the time to be rounded to an integral number of seconds. You can choose any period you'd like, or you can use a floating point representation in order to allow non-integral values:

      std::int64_t elapsed_attoseconds =
          std::chrono::duration_cast>
              (end-start).count();
      
      double elapsed_seconds =
          std::chrono::duration_cast>>
              (end-start).count();
      

      Note that in real code you should avoid using .count() to escape the strong typing provided by chrono::duration until you absolutely must.

      auto total_duration = end - start;
      auto seconds = std::chrono::duration_cast(total_duration);
      auto milli = std::chrono::duration_cast(total_duration - seconds);
      
      std::cout << seconds.count() << "s " << milli.count() << "ms\n";
      

提交回复
热议问题