对于小于 max_size 的大小,无法创建大于 max_size() 的 std::vector

cannot create std::vector larger than max_size() for size below max_size

我是 运行 google 一些基本缓存测试的基准,但我收到以下错误:

terminate called after throwing an instance of 'std::length_error'

what():  cannot create std::vector larger than max_size()

但是,我正在打印 max_size 和实际大小(见下文),而 max_size 等于 2^60-1,它在 2^28 处中断。我错过了什么?

基准代码如下。代码是使用 Clang 11 和 c++20 编译的。

static void bm_std_vector_in_cache_double(benchmark::State& state)
{
  auto constexpr d{3.1415};

  auto const bytes = (2 << state.range(0)) * 1024;
  auto data = std::vector<double>(bytes / sizeof(double), d);
  std::cout << data.max_size() << '\n';
  std::cout << data.size() << '\n';
  for (auto _ : state){
      auto sum = 0.0;
      for(auto j = 0; j < data.size(); ++j)
        benchmark::DoNotOptimize(sum += data[j] * data[j]);
    }

  state.SetBytesProcessed(state.iterations() * data.size());
}

BENCHMARK(bm_std_vector_in_cache_double)->DenseRange(1, 20);

这里的问题是字节类型是 int。

auto const bytes = (2 << state.range(0)) * 1024;

改为

auto const bytes = (2 << state.range(0)) * 1024L;

将其更改为 long 允许更长的向量,甚至更好 unsigned long long:

auto const bytes = (2 << state.range(0)) * 1024ULL;