2016-08-31 9 views
31

C++ 11, std::to_string'u tanıtıyor, bu yüzden bir uygulamaya baktım: vsnprintf'u dahili olarak çağırıyor. Tamam, ama neden boyut parametresini her zaman tipin 4 katı olarak ayarlıyor?std :: to_string uygulaması neden türün 4 katı büyüklüğünde bir tampon oluşturur?

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'den başlayarak, tüm int boyutları için dize artı izleyen sıfıra uyum sağlayacak kadar büyük bir arabellek oluşturur. –

+8

Ücretsiz yorum: onlar gerçekten bence '__ __ __ __' bence. – unwind

cevap

42

, bir N-ondalık değer ikili basamak maksimum sayısı ceil değeri (N * log (10)/log (2)).

işareti (havai ve tahsis) için
Decimals = ceil(8 * Size/3.32) = ceil(2.41 * Size). 

Alacağınız: Tek bir ondalık haneli hücrelerinin, ihtiyaçları (3.32) ikili rakam, bu 8 bit boyutları için 4.

öyle olduğunu

Decimals = 4 * Size. 

Not: Tek bir imzalı char'ın snprintf ile bir dönüşüm 5 bayta (işaret ve sonlandırma sıfır dahil) ihtiyaç duyar. Bir bayttan büyük boyutlu değerler için Decimals = 4 * Size bir sonuç sağlar, bu da yeterince büyüktür.

+0

Sadece merak için, bu denklemi nasıl buldunuz? – Garf365

+2

@ Garf365 bu baz değişikliği, sayı baz 2 (ikili) olarak kodlanmış ve 10 tabanına yazılmıştır. – dkg

İlgili konular