itoa和sprintf哪个更高效?

7
我正在构建我的第一个C++应用程序,选择一个高效的C++库是我考虑的设计之一。因此,我想将整数类型转换为字符串,并决定是否使用以下方法:
sprintf(string, "%d", x);

或者

整数转ASCII码

itoa(x, string);

有人能建议哪一条路线是高效的,并可能解释原因吗?

谢谢。


5
istringstream жИЦиАЕ boost::lexical_cast жАОдєИж†ЈпЉЯжѓХзЂЯињЩжШѓ C++гАВ - pmr
4
整数格式化是否真的会成为您的应用程序的瓶颈? - Kerrek SB
1
@Kerrek SB 在这个阶段每一点都很重要。 - Bitmap
4
我的第一个C++应用程序:你觉得每一点都很重要,是什么让你这样认为?其实并不是,现在只有完成它才是最重要的。除非你真的不想完成它,这也很常见。 - Hans Passant
4
永远不要使用sprintf。如果您不喜欢stringstream,那么请使用snprintf。如果人们使用这种方法,就可以防止许多缓冲区溢出攻击。对于itoa也是同样的道理,但它甚至不是标准C或C++。 - Nicol Bolas
显示剩余8条评论
3个回答

14

它们都很高效。更重要的是要注意,itoa()不是C++标准的一部分,因此在许多常见的运行时环境中不可用。(特别是,在libstdc++中没有包含它,因此在Mac OS X或Linux上不可用。)


10

不要使用这两个。使用 std::stringstream 等等。

std::stringstream ss;
ss << x;
ss.str();  // Access the std::string

无论如何,将其转换为字符串很可能不会成为您的应用程序执行时间的重要组成部分。


不是我,但我猜这个回答可能被踩是因为它没有回答原问题。 - legends2k
5
stringstream 在某些应用中非常缓慢(例如在高频交易中),这可能是其中一个显著的因素,而且它不允许转换为现有的 char* 缓冲区。 - Oleg Vazhnev
@javapowered:高频交易算法大概不会花费太多时间构建可读性强的字符串吧? - Oliver Charlesworth

0

从纯算法的角度来看,可以认为 itoa 更快,因为 sprintf 还需要解析格式说明符字符串。但是在没有对两个函数在实现中进行非平凡工作负载的基准测试之前,我们无法确定。

此外,这不是苹果和苹果之间的比较,因为两个函数不相等。除了前者是标准函数而后者不是之外,sprintf 可以执行比 itoa 更多的格式化操作。

附言:如果您可以使用 C++11,则可以使用返回 std::stringto_string。如果您想要除十进制以外的表示,则可以这样做:

int i = 1234;
std::stringstream ss;
ss << std::hex << i;       // hexadecimal
ss << std::oct << i;       // octal
ss << std::dec << i;       // decimal

std::bitset<sizeof(int) * std::numeric_limits<unsigned char>::digits> b(i);
ss << b;                   // binary

std::string str = ss.str();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接