C++ 为什么std::to_字符串的实现会创建一个4倍于类型大小的缓冲区?
C++11引入了C++ 为什么std::to_字符串的实现会创建一个4倍于类型大小的缓冲区?,c++,c++11,stdstring,C++,C++11,Stdstring,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", _
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); }
内联字符串
to_字符串(int_uval)
{返回uu gnu_cxx::u to_xstring(&std::vsnprintf,4*sizeof(int),
“%d”,_val);}
内联字符串
to_字符串(无符号值)
{返回uu gnu_cxx::u到_xstring(&std::vsnprintf),
4*sizeof(未签名),
“%u”,_val);}
内联字符串
到字符串(长值)
{return uu gnu_cxx::u to_xstring(&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
提供一个足够大的结果 它将创建一个足够大的缓冲区,以容纳从1到1的所有int大小的字符串加上尾随零。免费评论:我认为他们真的应该使用sizeof\uu val
。@无需展开,因为对于类型T,to\u字符串重载。只是出于好奇,你是怎么找到这个方程式的?@Garf365这是一个基数的变化,数字以2为基数(二进制)编码,以10为基数。