C++ 困境:关于 std::stoi

Posted

技术标签:

【中文标题】C++ 困境:关于 std::stoi【英文标题】:C++ dilemma: About std::stoi 【发布时间】:2014-03-08 02:42:42 【问题描述】:

我有一个两难境地,归结为(具体案例涉及更多):

    连接数字字符nc,最后应用std::stoi

    初始化int x=0;。在每次迭代中:x *= 10; x += (nc & 0xCF);

如果位数通常总是小于 6,那么什么会更有效?

【问题讨论】:

你只需要测量它就可以确定了。由于字符数很少,我什至会测试一个switch-case 构造,它使用fall through 来处理不同数量的字符。 @Praetorian 我想知道stoi 实际上在做什么.. 就转换而言,我不认为标准对它可以做什么施加任何限制。我查看了 VS2013 实现和 IIRC,他们调用 strtol,并在此之后添加错误检查。 @Praetorian,据我回忆,该标准要么使它使用strtol,要么非常强烈地鼓励它使用。它根据strtol 结果描述错误处理。 @Praetorian 真的..?我认为这回答了我的问题 【参考方案1】:

2 号几乎可以肯定更有效。它使用常量内存,避免动态分配,并且比std::stoi(处理备用基数,因此不太可能优化乘法步骤)做的工作更少

可维护性也是一个考虑因素。愿意动脑筋的程序员应该能够理解 #2,尤其是附带的注释。不幸的是,我的经验是,如果你有任何***的程序员在你的代码库上工作,他们可能会强烈偏爱#1。

不过,我不确定0xCF 这个神奇的数字。你不只是想要x += nc - '0'; 吗?它是可移植的,而且是惯用的,更容易理解。另一方面,使用 0xCF 进行掩码假定为 ASCII。对于'0' <= nc && nc <='9' 范围之外的字符,两者都没有做任何有意义的事情,但如果我使用按位算术,我会用0x0F 屏蔽。

【讨论】:

我总是尽可能按位进行,原因有很多

以上是关于C++ 困境:关于 std::stoi的主要内容,如果未能解决你的问题,请参考以下文章

C++ std::stoi 异常:无效参数

cygwin g++ std::stoi“错误:‘stoi’不是‘std’的成员

std::stoi 的基本参数

在 std::stoi 比较字节 0x90 上发现错误

std::atoi() 和 std::stoi 有啥区别?

std::stoi 的问题,不适用于 MinGW GCC 4.7.2