2017-08-02 12 views
0

以下のコードはLevelDBから取得したものです。私は理解のために2つのコードブロックを与えています。私は何が起こっているのか理解できません。LevelDB --- C++のコード

ThreadStateは構造体であり、ここでは読者が簡単にできるように書いています。

struct ThreadState { 
    int tid;    // 0..n-1 when running in n threads 
    Random rand;   // Has different seeds for different threads 
    Stats stats; 
    SharedState* shared; 

    ThreadState(int index) 
     : tid(index), 
      rand(1000 + index) { 
    } 
    }; 

マークされたコードは、ベンチマーククラスのオブジェクトインスタンス化の下にありますか?下のマークされたコードでは何が起こっていますか?

void Run() { 
     PrintHeader(); 
     Open(); 

     const char* benchmarks = FLAGS_benchmarks; 
     while (benchmarks != NULL) { 
     { 
      //code ommitted 
     } 

     // Reset parameters that may be overriddden bwlow 

     ***void (Benchmark::*method)(ThreadState*) = NULL;*** // What does this code line mean? // Benchmark is a class. 

     bool fresh_db = false; 
     int num_threads = FLAGS_threads; 

     if (name == Slice("fillseq")) { 
      fresh_db = true; 
      method = &Benchmark::WriteSeq; 
     } 

必要に応じて、ベンチマークも詳細に実装できます。

ありがとうございました!

答えて

1
void (Benchmark::*method)(ThreadState*) = NULL; 
// What does this code line mean? 
// Benchmark is a class. 

上記メンバ関数へのポインタです。メンバ関数は通常の関数と似ていない(有効なオブジェクトに対してのみ呼び出すことができる)ので、自由関数と同じ方法でそれらの関数を扱うことはできません。

したがって、上記の構文が導入されました。これは、クラス指定子Benchmark::を除く通常の関数ポインタに似ています。これは基本的に暗黙のthisポインターのタイプです。

methodは、ThreadState*をパラメータとし、戻り値の型がvoidであるメンバ関数へのポインタです。それを使用する理由は、おそらくコールを単純化するためです。まず、さまざまなパラメータに基づいて、メンバー関数が呼び出されるように選択され、その「アドレス」がmethodに格納されます。すべてのチェックが完了した後、メンバーへのポインタを介して選択された関数への呼び出しが1回だけになります。

なお、&Benchmark::WriteSeqは、コードがメンバ関数WriteSeqの「アドレス」を取得する方法です。修飾された関数名にはアドレス演算子を使用する必要があります。

+0

お返事ありがとうございました。それは私を助けてくれました。人生がスタックオーバーフローと同じくらい良かった場合のみ! –

+0

@NewUser - 幸せに助けてください:) – StoryTeller

関連する問題