首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么std::to_string的实现创建了一个4倍于该类型大小的缓冲区?

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

Stack Overflow用户
提问于 2016-08-31 16:22:11
回答 1查看 3.2K关注 0票数 31

C++11引入了std::to_string,所以我看了一个实现:它在内部调用vsnprintf。好吧,但是为什么它总是将size参数设置为type大小的4倍呢?

代码语言:javascript
复制
 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); }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-31 17:00:55

N-十进制值的最大二进制位数是(N * log(10) / log(2))的最大值。一个十进制数最多需要3.32位二进制数,即4位。

对于8位的大小,它是:

代码语言:javascript
复制
Decimals = ceil(8 * Size / 3.32) = ceil(2.41 * Size).

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

代码语言:javascript
复制
Decimals = 4 * Size.

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

票数 42
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39244344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档