6

通常、bignumは複数の単語を使用して実装されますが、可能な限り移植性のある単語サイズを選択したいと思います。これは、見た目よりも注意が必要std::uint64_tです。多くの32ビットコンパイラで使用できますがstd::uint32_t、32ビットマシンではおそらくより適切な選択です。したがって、std :: size_tを使用する誘惑になりますが、算術演算に最も効率的なタイプである特定のアーキテクチャの保証はありません。std::size_tたとえば、新しいx32 LinuxではABI std::size_tは32ビットですが、std::uint64_tそれでも最良の選択です。 。

C ++ 11には、さまざまなサイズの高速/最小タイプが定義されていますが、それらの相対的なパフォーマンスを照会する方法はありません。ポータブルな最良の答えはないかもしれないことを私は理解しています。今の私の最善の推測は、デフォルトstd::size_tで設定時に例外的なアーキテクチャを検出することです。しかし、もっと良い方法があるのでしょうか?

4

1 に答える 1

5

bignumを効率的に実装するための真の鍵は、基本的なワードサイズの2倍のビット数を提供する拡大乗算が必要なことです。したがって、プラットフォームが128ビットの乗算結果をサポートしている場合にのみ、基本的なワードサイズとしてuint64_tを使用できます。マシン上のポインタのサイズはほとんど関係ありません。

可能な限り移植性のある最も効率的な実装が本当に必要な場合は、コンパイル時にワードサイズを選択可能にする必要があります。次に、さまざまな異なるワードサイズでコードをビルドし、それらのビルドの結果が正しいかどうかをテストするautoconfigスクリプトを用意します。

#define WORD_(SIZE)    std::uint ## SIZE ## _t
#define WORD(SIZE)     WORD_(SIZE)
#define X2_(SIZE)      X2_ ## SIZE
#define X2(SIZE)       X2_(SIZE)
#define X2_8           16
#define X2_16          32
#define X2_32          64
#define X2_64          128

WORD(WORD_SIZE)コードでandを使用し、 orまたはorWORD(X2(WORD_SIZE))でコンパイルします
-DWORD_SIZE=8163264

于 2012-10-15T00:19:33.993 に答える