2012-10-13 28 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 अभी भी सबसे अच्छा विकल्प होगा।सी ++ 11 में बिग्नम को लागू करने के लिए सबसे कुशल शब्द आकार निर्धारित करना?

सी ++ 11 में विभिन्न आकारों के तेज़/कम प्रकार के प्रकार परिभाषित किए गए हैं, लेकिन यह उनके सापेक्ष प्रदर्शन से पूछताछ करने का कोई तरीका नहीं देता है। मुझे एहसास है कि कोई सर्वश्रेष्ठ पोर्टेबल उत्तर नहीं हो सकता है, मेरा सबसे अच्छा अनुमान अब std::size_t पर डिफ़ॉल्ट है और कॉन्फ़िगर समय पर असाधारण आर्किटेक्चर का पता लगाता है। लेकिन शायद एक बेहतर तरीका है?

+4

खैर संकलन, मैं uint_fast32_t लगता है या uint_fast64_t सबसे अच्छा समाधान हो सकता है। यह कम से कम आपके डेटा प्रकारों के लिए गति और कम से कम 32/64 बिट्स सुनिश्चित करेगा। शायद यह उनके लिए क्या मतलब है। – Morwenn

+0

"* सी ++ 11 जनादेश है कि std :: uint64_t उदाहरण के लिए मौजूद है *" नहीं, ऐसा नहीं है। यह वैकल्पिक है। इसके अलावा: "* लेकिन std :: uint32_t शायद 64-बिट मशीन पर बेहतर विकल्प होगा *" मुझे लगता है कि आप का मतलब है "** 32-बिट ** मशीन" –

+0

@ निकोलबोलस: ओह, आप दोनों मायने में सही हैं। –

उत्तर

5

वास्तविक कुंजी लागू करने वाले वास्तविक कुंजी यह है कि आपको एक चौड़ाई गुणा करने की आवश्यकता है जो आपको अपने मूल शब्द आकार के रूप में 2x के रूप में कई बिट्स देता है। इसलिए यदि आप अपना प्लेटफॉर्म 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)) और साथ
-DWORD_SIZE=8 या 16 या 32 या 64