首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法为低于max_size的大小创建大于max_size()的std::vector

无法为低于max_size的大小创建大于max_size()的std::vector
EN

Stack Overflow用户
提问于 2020-11-27 02:55:05
回答 1查看 2.8K关注 0票数 2

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

代码语言:javascript
运行
复制
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处中断。我遗漏了什么?

基准测试代码如下。代码是使用带有c++20的clang11编译的。

代码语言:javascript
运行
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-27 03:57:09

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

代码语言:javascript
运行
复制
auto const bytes = (2 << state.range(0)) * 1024;

更改为

代码语言:javascript
运行
复制
auto const bytes = (2 << state.range(0)) * 1024L;

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

代码语言:javascript
运行
复制
auto const bytes = (2 << state.range(0)) * 1024ULL;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65027806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档