[Bug libstdc++/96088] New: Range insertion into unordered_map is less effective than a loop with insertion
antoshkka at gmail dot com
gcc-bugzilla@gcc.gnu.org
Mon Jul 6 18:37:25 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96088
Bug ID: 96088
Summary: Range insertion into unordered_map is less effective
than a loop with insertion
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: antoshkka at gmail dot com
Target Milestone: ---
Consider the function f1:
static constexpr std::initializer_list<std::pair<const char*, int>> lst = {
{"long_str_for_dynamic_allocating", 1}};
void f1() {
std::unordered_map<std::string, int> m(1);
m.insert(lst.begin(), lst.end());
}
It creates a temporary and as a result makes 4 allocations. Meanwhile f2 does
not create a temporary and does aonly 3 allocations:
void f2() {
std::unordered_map<std::string, int> m(1);
for (const auto& x : lst) {
m.insert(x);
}
}
Godbolt playground: https://godbolt.org/z/VapmBU
More information about the Gcc-bugs
mailing list