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的主要内容,如果未能解决你的问题,请参考以下文章