#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”。另外我不知道任何快速输出功能,所以还有任何快速输出功能
答案 0 :(得分:3)
#define
使用预处理器使getcx
成为函数getchar_unlocked()
的简写,这是一个非锁定字符读取函数。
在没有理解这个非常基本的C片的情况下,你参加了几场编码比赛真是太棒了。
我上面链接的手册页提到putc_unlocked()
,这听起来几乎与输出相同。
答案 1 :(得分:3)
getchar_unlocked()
是getchar()
的主题不安全版本getchar_unlocked()
似乎更快的原因是它不会检查对于输入流上的任何锁定,它应该从哪里获取一个字符。因此,如果另一个线程已锁定输入流,则此线程为supposed to wait till lock count has come to zero。但是这个函数并不关心它,从而破坏了线程之间的同步。
但如果您确定缺少同步不会对您造成伤害,那么此功能可能会帮助您加快速度。
此外,只有在调用线程使用advised(或ftrylockfile()
)锁定标准输入时,才可以安全地使用它flockfile()。
答案 2 :(得分:2)
定义一个名为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来获得更快的输出功能。