【问题标题】:Why does GCC implement std::to_string using std::vsnprintf?为什么 GCC 使用 std::vsnprintf 实现 std::to_string?
【发布时间】:2020-12-03 07:40:08
【问题描述】:

最近,我查看了 GCC 的 basic_string.h 并注意到所有 std::to_string 重载都是使用 std::vsnprintf 实现的,例如:

inline string
to_string(int __val)
{
    return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(int), "%d", __val);
}

这不会带来很多开销吗?只需几行代码就可以对一个以 10 为基数的整数进行字符串化,那么为什么要使用 vsnprintf 来实现呢?

【问题讨论】:

  • 反问:大概那些“几行代码”已经在 vsnprintf 中尽可能高效地实现了,那为什么要重新实现呢?
  • std::vsnprintf 有什么开销?由于它是内联的,to_string 应该和vsnprintf 一样快。
  • 在实际将 int 转换为字符串之前,需要先解析字符串 "%d"。这一步完全没有必要。此外,任何可变参数函数都有一些开销,将其参数从堆栈中弹出,从外观上看,std::vsnprintf 将通过函数指针调用,除非内联,否则该函数指针也不是空闲的。
  • 优化后的代码中没有看到任何对 vsnprintf 的调用:godbolt.org/z/c4YYK6 并且编译器足够聪明,可以将std::to_string(42) 替换为字符串文字“42”

标签: c++ string gcc compilation printf


【解决方案1】:

考虑到他们还有很多其他的东西要为 C++ 11 实现,这看起来已经足够好了。

他们optimized 最近发布了 gcc 10。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2012-06-02
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多