2016-08-31 3 views
31

सी ++ 11 std::to_string प्रस्तुत करता है, इसलिए मैंने एक कार्यान्वयन पर एक नज़र डाली: यह आंतरिक रूप से vsnprintf पर कॉल करता है। ठीक है, लेकिन यह हमेशा आकार पैरामीटर को प्रकार के आकार के 4 गुणा के रूप में क्यों सेट करता है?std :: to_string का कार्यान्वयन किस प्रकार के आकार के 4 गुना बफर बनाता है?

inline string 
to_string(int __val) 
{ return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(int), 
              "%d", __val); } 

inline string 
to_string(unsigned __val) 
{ return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 
              4 * sizeof(unsigned), 
              "%u", __val); } 

inline string 
to_string(long __val) 
{ return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(long), 
              "%ld", __val); } 
+0

यह 1 बजे से int के सभी आकारों के लिए स्ट्रिंग प्लस पिछला शून्य समायोजित करने के लिए काफी बड़ा बफर बनाएगा। –

+8

नि: शुल्क समीक्षा: उन्हें वास्तव में मेरी राय में 'आकार __val' का उपयोग करना चाहिए था। – unwind

उत्तर

42

एक एन दशमलव मान की बाइनरी अंकों की अधिकतम संख्या का प्लस्तर लगाना मान (एन * लॉग (10)/लॉग (2))।

Decimals = ceil(8 * Size/3.32) = ceil(2.41 * Size). 

चिह्न (भूमि के ऊपर और आवंटन) के लिए आप मिल:: एक दशमलव अंकों प्लस्तर लगाना जरूरत है (33.2) बाइनरी अंकों, यही कारण है कि 4.

8 बिट के आकार के लिए

यह है

Decimals = 4 * Size. 

नोट: एक हस्ताक्षरित चार के स्नप्रिंटफ के साथ एक रूपांतरण में 5 बाइट्स (साइन और समाप्ति शून्य सहित) की आवश्यकता होती है। एक बाइट से अधिक आकार वाले मानों के लिए, Decimals = 4 * Size परिणाम प्रदान करता है, जो काफी बड़ा है।

+0

सिर्फ जिज्ञासा के लिए, आपको यह समीकरण कैसे मिला? – Garf365

+2

@ Garf365 यह आधार का एक परिवर्तन है, संख्या बेस 2 (बाइनरी) में एन्कोड किया गया है, और आधार 10 में लिखा गया है। – dkg

संबंधित मुद्दे