文書の過去の版を表示しています。
NestDAQ C++ techniques
- NestDAQ では開発者のコーディング量削減のため、Boost ライブラリといった便利な外部ライブラリ、さらに C++11 以上で採用された便利な機能が多く使われている。そのため、それなりに新しい C++ の書き方に慣れておく必要がある。個人的には、プログラミング初学者の可読性を考慮し、CERN ROOT v5 のインタープリター程度でつかえていた機能しか普段は使っていないので、なかなか覚えるのが大変。最近は new / delete を使わず、スマートポインタとかを使わないといけないらしい。(参考: servernote.net –【C++】new/deleteを撤廃しstd::shared_ptrを使う https://www.servernote.net/article.cgi?id=cpp-std-shared-ptr )
検証に使ったコード
型を調べる
- std::chrono ライブラリなどのライブラリを使っていると、型がよくわからなくなっていくる。ウェブで調べるのも良いが、コード中では、調べ方がいくつかあるようだ。Clang++ だと、typeid(parameter).name() として、結果を c++filt -t コマンドに渡すと、プラグラムで使われている型がどんな型かわかる。以下、確認用プログラム ( https://github.com/nobukoba/std_chrono_coding_sandbox/blob/f7f4b4db501db0b9b0aaab640c513e16c325d511/std_chrono_multi_platforms.cc ) の結果。
### Parameter definitions ### std::chrono::system_clock::time_point p_time_point; std::chrono::system_clock::duration p_duration; std::chrono::system_clock::period p_period; ### typeid().name() results ### typeid(p_time_point).name(): NSt6chrono10time_pointINS_3_V212system_clockENS_8durationIlSt5ratioILl1ELl1000000000EEEEEE typeid(p_duration ).name(): NSt6chrono8durationIlSt5ratioILl1ELl1000000000EEEE typeid(p_period ).name(): St5ratioILl1ELl1000000000EE ### c++filt -t results ### c++filt -t typeid(p_time_point).name(): std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > c++filt -t typeid(p_duration).name(): std::chrono::duration<long, std::ratio<1l, 1000000000l> > c++filt -t typeid(p_period).name(): std::ratio<1l, 1000000000l> ### system_clock::period::num and den check ### typeid(std::chrono::system_clock::period::num).name(): l typeid(std::chrono::system_clock::period::den).name(): l std::chrono::system_clock::period::num: 1 std::chrono::system_clock::period::den: 1000000000
std::chrono ライブラリ
- 時間、時刻関係の標準ライブラリ。C++11 から採用された模様。Boost からマージされたんだろうか?
- Apple の環境だと、std::chrono::duration の period がマイクロ秒であるが、Linux では、ナノ秒になっている。これにより、nano秒単位にキャストしているコードにおいて、Linux でコンパイルが通っても、macOS で通らないことがある。
- 参考: Stack Overflow – Apple clang: Why can I not create a time_point from std::chrono::nanoseconds https://stackoverflow.com/questions/65397041/apple-clang-why-can-i-not-create-a-time-point-from-stdchrononanoseconds
- 参考: Stack Overflow – platform-specific std::chrono::high_resolution_clock::period::num https://stackoverflow.com/questions/47687645/platform-specific-stdchronohigh-resolution-clockperiodnum
- 参考: Stack Overflow – Different behaviour of system_clock on windows and linux https://stackoverflow.com/questions/55120594/different-behaviour-of-system-clock-on-windows-and-linux