2017-08-02 70 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