小编Joa*_*ñoz的帖子

Lambda 与手动内联代码更改 GCC 的优化器行为

以下代码:

#include <vector>

extern std::vector<int> rng;

int main()
{
  auto is_even=[](int x){return x%2==0;};
  int res=0;
  for(int x:rng){
    if(is_even(x))res+=x;
  }

  return res;
}
Run Code Online (Sandbox Code Playgroud)

由 GCC 11.1(链接到 Godbolt)以一种非常不同的方式优化:

#include <vector>

extern std::vector<int> rng;

int main()
{
  int res=0;
  for(int x:rng){
    if(x%2==0)res+=x;
  }

return res;
}
Run Code Online (Sandbox Code Playgroud)

链接到 Godbolt。)此外,第二个版本(其中 lambda 已被直接手动注入其主体代替调用),比第一个版本快得多。

这是 GCC 错误吗?

c++ optimization lambda gcc

5
推荐指数
1
解决办法
115
查看次数

两个单独的键映射到std :: map中的单个条目

我正在研究一段代码,其目标是成为一个快速的"搜索引擎".我在一个文件中有条目,需要在读取整个文件后进行搜索.它们需要可以通过条目的名称进行搜索,并且它从文件的开头偏移.我的问题是内存使用问题,因为有数百万条目.目前我使用两个单独的std :: maps来存储数据,以便可以指定任一搜索项.这导致数据的双重存储,这正是我试图减少的.

我已经使用valgrind massif来发现内存使用的主要部分是条目的双重存储.

目前的储存方法:

struct entry {
    std::string name;
    uint16_t offset;
    uint16_t size;
    bool isConst;
};

nameSearchMap.insert(std::pair<std::string, entry>(s_entry.name, e_entry));
offsetSearchMap.insert(std::pair<uint16_t, SymInfo>(s_entry.offset, s_entry));
Run Code Online (Sandbox Code Playgroud)

有没有办法可以制作一个可以通过任何一种键搜索的地图?

c++ stdmap

1
推荐指数
1
解决办法
562
查看次数

标签 统计

c++ ×2

gcc ×1

lambda ×1

optimization ×1

stdmap ×1