2013-10-25 47 views
2

C++ 11具有to_string函數。在引擎蓋下,它使用vsnprintf將值寫入字符緩衝區。然後這用於初始化返回的字符串。由於vsnprintf需要使用的緩衝區的大小,因此計算並傳入。分配char緩衝區以保存浮點文本表示

對於確切類型,大小的計算使用的是sizeof。例如,對於unsigned long,計算是4 * sizeof(unsigned long)

但是對於浮點類型,其計算方式不同。在這種情況下所需要的緩衝區的大小使用

__gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20 

我會以爲這只是寫

std::numeric_limits<float>::max_exponent10 + 20 

我的問題是,爲什麼是大小在計算的內部庫的方式內部計算這條路?爲什麼他們不能只使用sizeof運營商。

+0

類型的大小通常與它所表示的值的範圍無關。例如,一個「long double」長度通常爲12或16個字節,但這不是其值範圍的度量。 –

回答

0

算得了什麼最長的代表,能值是整型,你可以用sizeof如下面的例子:

在32位系統的最大價值unsigned long需求10數字,加負號標誌-和一個字節爲\0,它至少需要12字節。所以,我認爲下面的表達是一個良好的估計:

4 * sizeof(unsigned long) // = 16 

 

對於float值這不是真的。這裏,max_exponent10是有用:

的std :: numeric_limits的值:: max_exponent10是最大 正數n,使得10N是 浮點類型T的可表示的有限值

+0

也許增加一些浮動表示,因爲它出現OP只是期望「0.123」等 – kfsone

+0

這很有道理,但一些細節仍然模糊。比如說爲什麼「+ 20」? –