C++ 快速输入背后的逻辑

C++ 快速输入背后的逻辑,c++,input,C++,Input,有人能解释一下这种快速输入背后的逻辑吗?我知道它比scanf快 int scan() { int ip=getchar_unlocked(),ret=0; for(;ip<'0'||ip>'9';ip=getchar_unlocked()); for(;ip>='0'&&ip<='9';ip=getchar_unlocked()) ret=ret*10+ip-'0'; return

有人能解释一下这种快速输入背后的逻辑吗?我知道它比scanf快

int scan()
{
    int ip=getchar_unlocked(),ret=0;
        for(;ip<'0'||ip>'9';ip=getchar_unlocked());

        for(;ip>='0'&&ip<='9';ip=getchar_unlocked())
            ret=ret*10+ip-'0';
    return ret;
}
int扫描()
{
int ip=getchar_unlocked(),ret=0;
对于(;ip'9';ip=getchar_unlocked());

对于(;ip>='0'&&ip,此处的
解锁部分是为了避免锁定输入文件(如果多个线程从同一输入读取,则可能会导致问题)

与使用
getchar
的其他方法相比,这可能是90%的增益所在,而这可能只比
scanf
稍微好一点。显然,
scanf
在解析格式字符串时也有开销,这可能是一点开销

代码的其余部分只是“跳过任何非数字的内容”,然后将十进制数读入
ret
,当数字为非数字时停止


对于读取大量输入,我建议使用
fread
(或者
mmap
或者
MapViewoOfFile
,如果已知系统支持其中一个调用),在缓冲区中加载大量输入数据,然后使用基于指针的方法“跳过非数字”(假设这是“安全的”操作)。很可能这比上面的代码还要快。

你还不明白什么?明白了,沃恩·卡托!!塔克斯..明白了@Mats-peterson..塔克斯回答