Pal*_*han 1 c c++ optimization atoi
假设我有一个char buf[12];我知道在左边用空格填充的右对齐无符号数.因此,例如:_________329(其中_代表空间).我能想到解析它的最快方法是这样的:
while (*buf == ' ') buf++;
atoi(buf);
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更快的方式,特别是atoi考虑到我们知道它是无符号的,atoi不假设..
我假设第一个字符是为"潜在符号"保留的,并且总是"空格"?因为否则,你只需要一个char[11]而不是一个char[12].无论如何,固定大小允许手动循环展开:
unsigned parse(const char(&b)[12])
{
return ((((((((((b[1] & 15))
* 10 + (b[2] & 15))
* 10 + (b[3] & 15))
* 10 + (b[4] & 15))
* 10 + (b[5] & 15))
* 10 + (b[6] & 15))
* 10 + (b[7] & 15))
* 10 + (b[8] & 15))
* 10 + (b[9] & 15))
* 10 + (b[10]& 15);
}
Run Code Online (Sandbox Code Playgroud)
请注意,该& 15技巧对空格和零处理相同,并且将同时使用ASCII(空格= 32,零= 48)和EBCDIC(空格= 48,零= 240).我还没有检查出其他字符编码:)
这实际上会更快还是更慢atoi?找出的唯一方法是衡量.但atoi在任何情况下我都会留下来,因为使用标准函数总能提高可读性.