【问题标题】:Why does the implementation of std::to_string create a buffer 4 times the size of the type?为什么 std::to_string 的实现会创建一个 4 倍于类型大小的缓冲区?
【发布时间】:2017-01-07 17:36:02
【问题描述】:

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); }

【问题讨论】:

  • 它将创建一个足够大的缓冲区来容纳字符串以及所有大小的 int 的尾随零,从 1 开始。
  • 免费评论:在我看来,他们真的应该使用sizeof __val
  • @unwind 没有必要,因为 to_string 对于类型 T 是重载的。

标签: c++ c++11 stdstring


【解决方案1】:

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 提供了一个足够大的结果。

【讨论】:

  • 只是为了好奇,你是怎么找到这个等式的?
  • @Garf365 这是base的变化,数字以base 2(二进制)编码,并以base 10写入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2013-09-21
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
相关资源
最近更新 更多