为什么 std::to_string 的实现会创建一个 4 倍于类型大小的缓冲区?
Why does the implementation of std::to_string create a buffer 4 times the size of the type?
C++11引入了std::to_string
,所以我看了一下一个实现:它在内部调用了vsnprintf
。好的,但是为什么它总是将大小参数设置为类型大小的 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); }
一个N十进制数的最大二进制位数是(N * log(10) / log(2))的ceil值。一个十进制数需要ceil(3.32)个二进制数,即4.
对于 8 位的大小是:
Decimals = ceil(8 * Size / 3.32) = ceil(2.41 * Size).
对于符号(开销和分配),您得到:
Decimals = 4 * Size.
注意:单个有符号字符的 snprintf 转换需要 5 个字节(包括符号和终止零)。对于大小大于一个字节的值,Decimals = 4 * Size
提供了一个足够大的结果。
C++11引入了std::to_string
,所以我看了一下一个实现:它在内部调用了vsnprintf
。好的,但是为什么它总是将大小参数设置为类型大小的 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); }
一个N十进制数的最大二进制位数是(N * log(10) / log(2))的ceil值。一个十进制数需要ceil(3.32)个二进制数,即4.
对于 8 位的大小是:
Decimals = ceil(8 * Size / 3.32) = ceil(2.41 * Size).
对于符号(开销和分配),您得到:
Decimals = 4 * Size.
注意:单个有符号字符的 snprintf 转换需要 5 个字节(包括符号和终止零)。对于大小大于一个字节的值,Decimals = 4 * Size
提供了一个足够大的结果。