[英]Fast input output function
#define getcx getchar_unlocked
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();}
while( ch >= '0' && ch <= '9' )
n = (n<<3)+(n<<1) + ch-'0', ch=getcx();
n=n*sign;
}
嗨我一直在各种编码竞赛中使用上述功能输入,但从来没有能够理解为什么它很快。 我知道逻辑,但不知道它的坚牢度的概念。 例如,这行是做什么的“#define getcx getchar_unlocked”。 另外我不知道任何快速输出功能,所以还有任何快速输出功能
#define
使用预处理器使getcx
成为函数getchar_unlocked()
,这是一个非锁定字符读取函数。
你在参加几个编码竞赛时没有理解这个非常基本的C片,这有点太棒了。
我上面链接的手册页提到了putc_unlocked()
,这听起来几乎和输出一样。
getchar_unlocked()
是getchar()
的线程不安全版本getchar_unlocked()
似乎更快的原因是它不检查输入流上应该从哪里获取字符的任何锁定。 因此,如果另一个线程已锁定输入流,则该线程应该等到锁定计数变为零 。 但是这个函数并不关心它,从而破坏了线程之间的同步。
但如果您确定缺少同步不会伤害您,那么此功能可能会帮助您更快一点。
此外,它建议您只有在调用线程使用flockfile() (或ftrylockfile()
)锁定stdin时才能安全地使用它。
定义一个名为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来获得更快的输出函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.