Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::to_字符串的实现会创建一个4倍于类型大小的缓冲区?_C++_C++11_Stdstring - Fatal编程技术网

C++ 为什么std::to_字符串的实现会创建一个4倍于类型大小的缓冲区?

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", _

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); }
内联字符串
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为基数。