2017-10-24 9 views
-1

http://cs.brown.edu/~jak/proglang/cpp/stltut/tut.htmlおよびhttp://www.geeksforgeeks.org/c-qsort-vs-c-sort/から、STLのソートメカニズムを使用する方がCのqsort()より高速であることがわかります。C++演算子はいつ実際にインライン化されますか?

これは、比較関数が「インライン化」されているためです。しかし、コンパイラエクスプローラhttps://godbolt.org/でgccコンパイラの出力を調べると、実際にインライン化される演算子を得ることができません。例えばhereを参照してください、コードは以下の通り:

#include <string> 
#include <algorithm> 
#include <vector> 
#include <cstdlib> 
#include <iostream> 

using namespace std; 

class myClass { 
    public: 

    int key; 
    int data; 

    myClass(int k, int d) : key(k), data(d) {} 

    inline bool operator<(myClass& other) { 
     return key < other.key; 
    } 
}; 

main() { 
    myClass c1(1,100), c2(2, 100); 
    if (c1 < c2) cout << "True" << endl; 
    else cout << "False" << endl; 
} 

生成されたアセンブリコードは明らかにoperator<ルーチンを呼び出します。 C++コンパイラはinlineキーワードを完全に無視しました!

正確にの場合、演算子はインライン化されていますか?これは、例えば、より速いソーティングパフォーマンスを得るための鍵ですが、可能な限りいつでもそれを活用する方法を知っているとよいでしょう。

+2

最適化をオンにしましたか? – Galik

+0

ああ、私はそれがすべてだったと信じることができません – Mahkoe

+1

注: 'inline'はメンバ関数のために冗長です_defined_はクラス本体の中にあります。自動的にインラインで作成されます。 –

答えて

4

ほとんどのコンパイラは、デフォルトでは何もインライン化しません。なぜなら、これはデバッグの途中にある可能性があるからです。最適化を有効にする必要があります。

gccにはlevels of optimizationsと個別に調整可能な最適化設定がいくつかありますが、最も簡単な"-O1" flag is enoughでもoperator<機能をインライン化させることさえあります。 (実際にはgccは実際にコンパイル時にoperator<の結果を判断でき、elseブランチを完全に破棄することができることを認識しました!)

関連する問題