2017-08-02 43 views
0

以下給出的代碼取自LevelDB。爲了更好的理解,我給了兩個代碼塊。我無法理解發生了什麼。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) { 
    } 
    }; 

下面的標記代碼是類Benchmark的對象實例嗎?下面標記的代碼中發生了什麼?

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中。在所有檢查完成後,通過指向成員的指針僅對所選函數進行一次調用。

順便提一句,&Benchmark::WriteSeq是代碼如何獲取成員函數WriteSeq的「地址」。您必須在限定的函數名稱上使用address-of運算符。

+0

非常感謝您的回答。它確實幫了我很多。只有當生活像stackoverflow一樣好! –

+0

@NewUser - 樂於助人:) – StoryTeller