2012-10-13 57 views
6

典型的bignums是通過使用多個單詞來實現的,但是我希望儘可能便於選擇單詞大小。這是更棘手比看起來 - std::uint64_t在許多32位編譯器可用,但std::uint32_t很可能會在32位機器上的一個更好的選擇。所以,誘惑那麼將使用std ::爲size_t,但有一個給定的架構,std::size_t是最有效的類型算術無法保證,例如在the new x32 Linux ABIstd::size_t將是32位,但std::uint64_t仍然是最好的選擇。確定用於在C++ 11中實現bignums的最有效的字大小?

C++ 11具有快/至少類型定義的各種尺寸,但它並沒有給查詢他們的相對性能的任何方式。我意識到可能沒有最好的便攜式答案,我現在最好的猜測是默認爲std::size_t,並在配置時檢測特殊架構。但也許有更好的方法?

+4

好編譯,我覺得uint_fast32_t或uint_fast64_t可能是最好的解決方案。它至少可以確保您的數據類型的速度和至少32/64位。這可能是他們的意思。 – Morwenn

+0

「* C++ 11要求std :: uint64_t存在例如*」不,它不。這是可選的。又道:「但*的std :: uint32_t的很可能是一個64位的機器上一個更好的選擇*」我想你指的是「** 32位**機」 –

+0

@NicolBolas:哎呀,你是在這兩方面是正確的。 –

回答

5

真正的關鍵高效地實現大數是,你需要有一個不斷擴大的乘法,給你2倍一樣多的位你的基本字的大小。因此,如果您的平臺支持128位乘法結果,則只能使用uint64_t作爲基本字大小。你機器上的指針大小基本上是不相關的。

如果你真的想最有效的實現,是儘可能實現可移植性,你應該讓字的大小選擇在編譯的時候。然後有一個自動配置腳本(試圖)以各種不同的字大小構建代碼,並測試這些構建的結果以確保正確性和速度。

#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))
-DWORD_SIZE=8163264

相關問題