【发布时间】: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