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

4

3 回答 3

3

使用#define预处理器制作getcx函数的简写getchar_unlocked(),它是一个非锁定字符读取函数。

你参加了几场编码比赛,却不了解这个非常基本的 C 语言,这真是太棒了。

我在上面链接到的手册页提到putc_unlocked()了这听起来几乎是一样的东西,但用于输出。

于 2012-08-22T13:02:37.897 回答
3

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

但是,如果您确定缺少同步不会对您造成伤害,那么此功能可能会帮助您更快一些。

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

于 2012-08-22T13:02:55.370 回答
2

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

#define getcx getchar_unlocked

定义inp为 inline 以便更快:

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

于 2012-08-22T13:03:58.090 回答