2013-10-25 22 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”? –