微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Google Benchmark Ba​​seClass 初始化发生在静态变量赋值导致问题之前

如何解决Google Benchmark Ba​​seClass 初始化发生在静态变量赋值导致问题之前

我想使用 google 基准测试来运行我的代码,其中包含一个静态全局变量。在基准测试的基类中,我需要读取这个变量来执行一些设置。但是在初始化基准基类时,该静态变量尚未初始化并导致问题。

下面的最小复制示例包含三个文件test.htest.ccbenchmark_main.ccbenchmark_main.cc 包含一个基准基类 Init。它的构造函数读取 data 变量。但此时,data 变量仍为空。

问题:有没有办法让 data 变量初始化发生在基类初始化之前?也欢迎任何其他解决方法

test.h

#include <array>
#include <vector>

using namespace std;

const vector<int>& func(int);

test.cc

#include "test.h"

const array<vector<int>,5> data = {
        vector<int>({1}),{2,3},{4,5},{6,7},{8}
};

const vector<int>& func(int index) {
        return data[index];
}

benchmark_main.cc

#include <benchmark/benchmark.h>
#include <iostream>
#include "test.h"

class Init: public benchmark::Fixture {
protected:
public:
    Init() {
        std::cout << func(1)[0] << '\n';
    }
};

BENCHMARK_F(Init,A)(benchmark::State &state) {
  for (auto _ : state)
    std::cout << func(1)[0] << '\n';
}

BENCHMARK_MAIN();

解决方法

您的问题是 C++ 中的全局变量在不同翻译单元(即 .cc 文件)之间具有未定义的初始化顺序。

我看到了一些解决方法:

  1. 将代码从 test.cc 移到 benchmark_main.cc 的顶部,因为全局变量在单个文件中按声明顺序进行初始化。这在本例中是微不足道的,但在大型项目中就不是那么容易了。
  2. data 全局变量改为 func() 中的静态变量。这可能会在一定程度上影响性能,因为它会在每次调用函数时检查静态是否已初始化。
  3. 您可以进行特定于编译器的调整来修改全局变量的初始化顺序。例如:https://docs.microsoft.com/en-us/cpp/preprocessor/init-seg?view=msvc-160
  4. 您可以更直接地使用 API 来避免使用全局变量,而不是使用 BENCHMARK_F 宏。 Google benchmark custom main 可能会对此有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?