LevelDB --- C++中的代码
问题描述:
以下给出的代码取自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;
}
如果需要的话,我可以给出基准的详细实施。
非常感谢您的帮助!
答
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运算符。
非常感谢您的回答。它确实帮了我很多。只有当生活像*一样好! –
@NewUser - 乐于助人:) – StoryTeller