快速输入输出function

#define getcx getchar_unlocked inline void inp( int &n )//fast input function { n=0; int ch=getcx();int sign=1; while( ch  '9' ){if(ch=='-')sign=-1; ch=getcx();} while( ch >= '0' && ch <= '9' ) n = (n<<3)+(n<<1) + ch-'0', ch=getcx(); n=n*sign; } 

嗨我一直在使用上述函数在各种编码竞赛中输入,但从来没有能够理解为什么它快。 我知道逻辑,但不知道它的坚牢度的概念。 例如,这行是做什么的“#define getcx getchar_unlocked”。 另外我不知道任何快速输出function,所以还有任何快速输出function

getchar_unlocked()getchar()的线程不安全版本getchar_unlocked() 看起来更快的原因是它不检查输入流上应该从哪里获取字符的任何锁定。 因此,如果另一个线程锁定了输入流,则该线程应该等到锁定计数变为零 。 但是这个函数并不关心它,从而破坏了线程之间的同步。

但是如果你确定缺乏同步不会伤害你,那么这个function可能会帮助你加快速度。

此外,它建议您只有在调用线程使用flockfile() (或ftrylockfile() )锁定stdin时才能安全地使用它。

#define使用预处理器使getcx成为函数getchar_unlocked() ,这是一个非锁定字符读取函数。

在没有理解这个非常基本的C片的情况下,你参加了几场编码比赛,这有点太棒了。

我上面链接的手册页提到了putc_unlocked() ,这听起来几乎和输出一样。

定义一个名为getcx的宏,以便在读取时不使用锁。 这不是线程安全的,但如果您不担心线程安全性会更快:

 #define getcx getchar_unlocked 

inp定义为内联,以便更快:

 inline void inp( int &n )//fast input function { n=0; int ch=getcx();int sign=1; while( ch < '0' || ch > '9' ){if(ch=='-')sign=-1; ch=getcx();} 

将n乘以10(使用shift计算8 * n + 2 * n,这可能更快):

  while( ch >= '0' && ch <= '9' ) n = (n<<3)+(n<<1) + ch-'0', ch=getcx(); n=n*sign; } 

当线程安全性不是问题时,您可以使用putchar_unlocked来获得更快的输出函数。