3

(とりわけ) ほぼすべてのプラットフォームで clock_gettime() API を使用できるようにする小さな C++ ユーティリティ ライブラリを作成しようとしています。利用できない場合は、他のタイマー API に基づいて実装します。簡単ですよね?これはかなり些細なことだと思っていたので、当然のことながら、思い通りにすることはほとんど不可能であることが判明しました。;)

これが私の問題です: ユーザーが clock_gettime() API を透過的に呼び出せるようにしたい場合は、ネイティブの宣言/定義が存在するかどうかを正確に検出するヘッダー ファイルが必要です。

  • 楽観的な検出は明らかな理由で機能しません。clock_gettime() が存在しないが、ヘッダーのプリプロセッサ マクロが存在すると判断した場合、定義されず、ユーザーはコンパイラ エラーを受け取ります。
  • 保守的な検出はさらに悪い: clock_gettime が存在し、#include されているが、ヘッダーがそれを検出しない場合、自分の実装はそれと競合します...そして、コンパイラが clock_gettime( ) 再定義されています。代わりに、既存の clock_gettime() を「オーバーライド」すると、関数が呼び出されますが、完全に奇妙な未定義の動作が発生し、クラッシュするか、無限ループに陥ります (フォールバック実装にループがない場合でも)。 )。

それで、clock_gettime() を検出する信頼できる方法はありますか? clock_gettime() が存在する場合、 unistd.h が _POSIX_TIMERS マクロを定義することになっていることは知っています...しかし、これはすべての実装で保証されていますか? (私の理解ではそうではありませんが、間違っている可能性があります。)

  • その場合、unistd.h が存在するかどうかを確実に検出するにはどうすればよいですか (少なくとも MSVC では Windows には存在せず、Linux/BSD には存在しますが、多くのマイナーな OS などがあります)。
  • そうでない場合、それを確実に検出するために単純なヘッダーファイルでできることは他にありますか?

「自動」ソリューションがない場合、clock_gettime() をサポートする (またはサポートしない) すべてのプラットフォームの信頼できる正確なリストと、それらの識別マクロ ( http://sourceforge.net/pにないもの) はありますか? /predef/wiki/OperatingSystems/ )? 新しいプラットフォームが登場するとリストが同期しなくなる可能性があるため、これは理想的ではありませんが、何もないよりはましです。

もちろん、自分の小さなライブラリ用にまったく新しいタイマー API を作成することもできます。その後、保守的に clock_gettime() を検出し、必要に応じて他のバックエンドにフォールバックすることができました。これは簡単に機能する明らかな解決策ですが...別のばかげたタイマー API を学びたい人はいますか? 特定の関数が既に存在するかどうかを検出するメカニズムが組み込まれていない言語の愚かさを回避するためだけに、世界は本当にそれを必要としていますか? ;)

*正当化: C++11 の std::chrono を使用しないのはなぜですか?

  1. C++11 クロノ インターフェイスは、特定の種類のベンチマークに適したプロセス タイマーをサポートしていません。これらのタイマーはすべてのプラットフォームで利用できるわけではありませんが、ベスト エフォート ベースで使用したいと思います。clock_gettime() は、それらをサポートする最もよく知られている既存のインターフェイスです。
  2. このコードを C++03 で実行したいので、基礎となる言語標準や OS に関係なく、一貫したユーザー インターフェイスが必要です...そして、C++11 std 全体を再実装する方法はありません。 ::chrono インターフェイスを持たないプラットフォームでは。それは正気ではないでしょう。
4

0 に答える 0