2012-10-13 2 views
6

通常、複数の単語を使用してbignumが実装されていますが、可能な限り移植可能なサイズの単語を選択したいと考えています。多くの32ビットコンパイラではstd::uint64_tが利用可能ですが、std::uint32_tはおそらく32ビットマシンではより良い選択になるでしょう。例えば、the new x32 Linux ABIstd::size_tのように、std::size_tが最も効率的な算術演算の型であるという保証はありませんが、std::uint64_tは依然として最良の選択です。C++ 11でbignumsを実装するための最も効率的な単語サイズの決定

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

+4

してコンパイルします。少なくとも、データ型には32/64ビット以上の速度が必要です。それはおそらく彼らが意味するものです。 – Morwenn

+0

"* C++ 11では、std :: uint64_tが存在することを要求しています。たとえば、「いいえ、そうではありません。オプションです。また、 "* std :: uint32_tはおそらく64ビットマシン上でより良い選択になるでしょう*"私はあなたが "** 32-bit ** machine"を意味すると仮定します。 –

+0

@NicolBolas:あなたは両方の数が正しいです。 –

答えて

5

bignumsを効率的に実装するための実際のキーは、基本ワードサイズの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)WORD(X2(WORD_SIZE))とまあ、私はuint_fast32_t考えたりuint_fast64_tが最善の解決策かもしれない
-DWORD_SIZE=8または16または32または64

関連する問題