6

マシン int や GMP 整数などの一般的な整数型で機能するアルゴリズムを備えた数学ソフトウェアを設計しています。パフォーマンスのために、通常はマシン int を使用したいと考えますが、オーバーフローが発生した場合は、GMP に切り替えることを試みることができます。理想的には実行時に。これまでのところ、プログラム全体が整数型のテンプレートとして書かれています。ライブラリが大きくなるにつれて、問題が大きくなります。

  • コンパイル時間とメモリ消費量が手に負えなくなっています。
  • コンパイル時のエラー メッセージはあまり役に立ちません。
  • デバッグはより苦痛です。
  • コード全体はヘッダー ファイルにあります。

次の解決策を考えることができます。コンパイル時マクロを介して typedef された固定型に依存するようにコードをリファクタリングします。次に、ライブラリのコピーを整数型ごとに 1 つずつ作成し、実行可能ファイルでそれらをリンクします。欠点は、ライブラリ自体へのインターフェイスが必要なようです。

簡単な質問は次のとおりです。プログラムのほぼ全体が型に依存している状況の設計パターンは何ですか?

4

2 に答える 2

4

GNU 多倍精度演算ライブラリは、

小さなオペランドと巨大なオペランドの両方で、可能な限り高速になるように慎重に設計されています。

言い換えれば、GMP ライブラリを使用すれば、これらの問題を処理し、多くの労力を節約できます!

于 2013-01-31T17:10:11.777 に答える
2

私自身の数学ソフトウェアでは、デフォルトで GMP を使用していますが、使用できない場合はフォールバックを提供したいと考えています。また、低速のマシンでコンパイルを遅くする巨大な gmpxx ヘッダー ファイルも気に入りませんでした。

したがって、私は本質的に未定義の整数に対してラッパークラスを作成しました(pimpl using を使用std::aligned_storage)。バックエンドはコンパイル時に選択できます。

これにより、テンプレートがなくなり、十分な柔軟性が得られます。

于 2013-01-31T17:21:51.137 に答える