2016-11-29 4 views
1

値がすぐに評価されない場合(つまり、オブジェクト/変数をインクリメントしたい場合)、STLイテレータでプリインクリメントを使用することをお勧めします。イテレータ)。これは、一般に、事前インクリメントの実装がポストインクリメントよりも効率的であるためである。pre-increment対std :: atomicのポストインクリメント<int>

しかし、std :: atomicについてはどうですか?静的解析(PVSスタジオを使用)を実行すると、プリインクリメントがより効率的であるという警告が表示されますが、プリインクリメント(Visual Studio 2015)の実装を見ると、ポストインクリメントより効率が悪くなりますか?

STLアトミック値のプリインクリメントオーバーポストインクリメントを使用する一般的なルールはありますか、それとも実装固有ですか?

+3

「ポストインクリメントよりも効率が悪いですか?」どのように見える*効率が悪い*? – user2079303

答えて

1

効率(このレベルで)は常に実装固有です。

たとえば、「STLイテレータのプリエンプトを好む」経験則の逆数として、実際には、プリインクリメントとポストインクリメント用に異なるコードを生成するコンパイラはほとんどありません。 (ポストインクリメントのスプリアスコピーはちょうど何も離れて最適化されます。)

+0

疑似コピーが最適化されていれば、ポストインクリメント用に生成されるコードはどのようにプリインクリメントと異なりますか?編集:ああ、あなたが生成されたコードが異なることはまれであることを意味した。私は誤解しました。 – user2079303

+0

@ user2079303:そうではありません。それが私の要点です。 'it ++;'と '++ it;'は通常同じコードを生成します。 (もちろん、インクリメントの結果を使用すると、コードは明らかに異なります。) –

2

私は今のウィンドウにアクセスすることはできませんが、gccのでは、違いがある

__atomic_fetch_add(&_M_i, 1, memory_order_seq_cst); 

__atomic_add_fetch(&_M_i, 1, memory_order_seq_cst); 

が組み込まれているため、コンパイラが最適化の方法を知っていると仮定できます。両方のための

あなたは結果を使用しない場合は、gccの-O3利回り

lock add  DWORD PTR [rdi], 1 

あなたは結果を使用する場合、前置インクリメントのために、その後のgcc -O3利回り

mov  DWORD PTR [rsp-24], edi 
    mov  eax, 1 
    lock xadd  DWORD PTR [rsp-24], eax 
    add  eax, 1 
    ret 

、およびポストインクリメントのためadd eax, 1を省略し、その技術的には、はい、前置インクリメントが1つのADDによってあまり効率的であるが、実際にはシーケンシャルなメモリアクセスに比べて矮小です。

TLDR:心配はいりません

関連する問題