为什么std :: to_string的实现创建了4倍于该类型大小的缓冲区?

xwl*_*xwl 31 c++ stdstring c++11

C++ 11介绍了std::to_string,所以我看了一个实现:它在vsnprintf内部调用.好的,但为什么总是将size参数设置为类型大小的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); }
Run Code Online (Sandbox Code Playgroud)

小智 42

N十进制值的最大二进制位数是(N*log(10)/ log(2))的ceil值.单个十进制数字需要ceil(3.32)二进制数字,即4.

对于8位的大小,它是:

Decimals = ceil(8 * Size / 3.32) = ceil(2.41 * Size).
Run Code Online (Sandbox Code Playgroud)

对于符号(开销和分配),您将得到:

Decimals = 4 * Size.
Run Code Online (Sandbox Code Playgroud)

注意:使用单个签名char的snprintf进行转换需要5个字节(包括符号和终止零).对于大小大于一个字节的值,Decimals = 4 * Size提供足够大的结果.

  • @ Garf365这是一个基数的变化,数字编码在基数2(二进制),并写在基数10. (2认同)