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;
}

こんにちは私はさまざまなコーディングコンテストで入力に上記の関数を使用していますが、なぜそれが速いのか理解できませんでした。私は論理を知っていますが、その堅牢性の概念を知りません。たとえば、この行は「#definegetcxgetchar_unlocked」を実行しています。また、高速出力機能がわからないので、高速出力機能もありますか?

4

3 に答える 3

3

#defineプリプロセッサを使用して、非ロック文字読み取り関数であるgetcxfunction の短縮形になります。getchar_unlocked()

C のこの非常に基本的な部分を理解せずに、いくつかのコーディング コンテストに参加したことは、少し素晴らしいことです。

私がリンクした上記のマニュアルページはputc_unlocked()、ほとんど同じもののように聞こえますが、出力用です。

于 2012-08-22T13:02:37.897 に答える
3

getchar_unlocked()のスレッドアンセーフバージョンです。より高速に見えるgetchar()理由は、文字をフェッチするはずの入力ストリームのロックをチェックしないためです。そのため、別のスレッドが入力ストリームをロックした場合、このスレッドはロック カウントがゼロになるまで待機することになっています。しかし、この関数はそれを気にしないため、スレッド間の同期が破壊されます。getchar_unlocked()

しかし、同期の欠如があなたに害を及ぼさないと確信しているなら、この機能はあなたが少し速くなるのを助けるかもしれません.

また、呼び出しスレッドがflockfile() (または) を使用して stdin をロックしている場合にのみ、安全に使用できることをお勧めします。ftrylockfile()

于 2012-08-22T13:02:55.370 に答える
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を使用して出力関数を高速化できます。

于 2012-08-22T13:03:58.090 に答える