快速输入输出功能

时间:2012-08-22 12:53:16

标签: c++ c coding-style operating-system

#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”。另外我不知道任何快速输出功能,所以还有任何快速输出功能

3 个答案:

答案 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来获得更快的输出功能。