Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法为小于max\u size的大小创建大于max\u size()的std::vector_C++_Stdvector_Google Benchmark - Fatal编程技术网

C++ 无法为小于max\u size的大小创建大于max\u size()的std::vector

C++ 无法为小于max\u size的大小创建大于max\u size()的std::vector,c++,stdvector,google-benchmark,C++,Stdvector,Google Benchmark,我正在运行google benchmark进行一些基本的缓存测试,我发现以下错误: terminate called after throwing an instance of 'std::length_error' what(): cannot create std::vector larger than max_size() 但是,我正在打印最大尺寸和实际尺寸(见下文),当最大尺寸等于2^60-1时,它在2^28处断裂。我错过了什么 下面是基准代码。代码是使用c++20中的Clang1

我正在运行google benchmark进行一些基本的缓存测试,我发现以下错误:

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

what():  cannot create std::vector larger than max_size()
但是,我正在打印最大尺寸和实际尺寸(见下文),当最大尺寸等于2^60-1时,它在2^28处断裂。我错过了什么

下面是基准代码。代码是使用c++20中的Clang11编译的

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);
static void bm\u std\u vector\u in\u cache\u double(基准::状态和状态)
{
auto constexpr d{3.1415};

auto const bytes=(2这里的问题是字节的类型是int

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

自动常量字节=(2在
2^28处断开,或者这是它工作的最后一个大小吗?最好在尝试创建向量之前打印
max\uu
和请求的大小,以便您可以更容易地看到它在哪里断开。2^27是最后一个工作的大小。该错误消息选择得非常糟糕。发生故障的原因是您无法分配contiguous块的大小为2^28个元素或更多。但是
max_size
本身的有用性(更准确地说,缺少它)是有争议的。@Yksisarvinen您可能会想。正如我所说,这是一个可怕的信息。
auto const bytes=(2个更好,2ULL)。
auto const bytes = (2 << state.range(0)) * 1024L;
auto const bytes = (2 << state.range(0)) * 1024ULL;