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

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

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

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

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

【问题讨论】:

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

标签: c++ string int type-conversion


【解决方案1】:

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

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

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

【讨论】:

  • 我总是尽可能按位进行,原因有很多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2018-04-21
相关资源
最近更新 更多