c++ - LevelDB --- C++ 代码

标签 c++ key-value key-value-store key-value-coding leveldb

下面给出的代码取自 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/

相关文章:

javascript - 正确循环事件主体类的对象键/值

java - Java 中的键值对

php - 我的网站使用数据库模型

c++ - 在线程已经启动后将变量传递给线程

c++ - "pthread_mutex_t mutex = {0}"是否初始化互斥量?

具有结构的 C++ vector 不起作用?

mysql键/值存储问题

java - 需要一个分布式键值查找系统

caching - 按 Redis 缓存中的值搜索 - 二级索引

c++ - 如何在 if-constexpr 中使用概念?