下面给出的代码取自 LevelDB。我给出了两个代码块以便更好地理解。我无法理解发生了什么。
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;
}
如果需要,我也可以给出 Benchmark 的详细实现。
非常感谢您的帮助!
最佳答案
void (Benchmark::*method)(ThreadState*) = NULL;
// What does this code line mean?
// Benchmark is a class.
上面是指向成员函数的指针。由于成员函数不像常规函数(它们只能在有效对象上调用),因此您不能像自由函数那样获取它们的地址。
因此引入了上面的语法。除了类说明符 Benchmark::
之外,它类似于常规函数指针。这本质上是隐式 this
指针的类型。
在您的例子中,method
是一个指向以 ThreadState*
作为参数并具有 void
返回类型的成员函数的指针.使用它的原因很可能是为了简化调用。首先,根据各种参数,选择调用一个成员函数,并将其“地址”存储在method
中。完成所有检查后,只有一次通过指向成员的指针调用所选函数。
顺带一提,&Benchmark::WriteSeq
就是代码获取成员函数WriteSeq
的“地址”的方式。您必须在限定的函数名称上使用地址运算符。
关于c++ - LevelDB --- C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45452318/