以下代码:
#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 错误吗?
我正在研究一段代码,其目标是成为一个快速的"搜索引擎".我在一个文件中有条目,需要在读取整个文件后进行搜索.它们需要可以通过条目的名称进行搜索,并且它从文件的开头偏移.我的问题是内存使用问题,因为有数百万条目.目前我使用两个单独的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)
有没有办法可以制作一个可以通过任何一种键搜索的地图?