http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54307
Bug #: 54307 Summary: [4.7 regression] increases in memory usage by some C++11 (and C++03) standard containers Classification: Unclassified Product: gcc Version: 4.7.1 Status: UNCONFIRMED Severity: major Priority: P3 Component: libstdc++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: m...@use.net Between 4.6 and 4.7.x, the memory used by a few standard containers has increased, resulting in some OOM and performance issues on an amd64 application I work on. 4.7: list<int> size = 24 unordered_map<int,int> size = 64 unordered_set<int,int> size = 64 4.6: list<int> size = 16 unordered_map<int,int> size = 56 unordered_set<int,int> size = 56 comparing to VC11: list<int> size = 16 unordered_map<int,int> size = 64 unordered_set<int,int> size = 64 compile commandline is just -std=c++0x. testcase program below: #include <vector> #include <array> #include <deque> #include <forward_list> #include <list> #include <queue> #include <stack> #include <tuple> #include <map> #include <set> #include <hash_map> #include <hash_set> #include <unordered_map> #include <unordered_set> #include <string> using namespace std; int main(void) { vector<int> v; printf("vector<int> size\t = %d\n", sizeof(v)); array<int,5> a; printf("array<int,5> size\t = %d\n", sizeof(a)); deque<int> d; printf("deque<int> size\t = %d\n", sizeof(d)); forward_list<int> f; printf("forward_list<int> size\t = %d\n", sizeof(f)); list<int> l; printf("list<int> size\t = %d\n", sizeof(l)); queue<int> q; printf("queue<int> size\t = %d\n", sizeof(q)); stack<int> s; printf("stack<int> size\t = %d\n", sizeof(s)); tuple<int,int,int> t; printf("tuple<int,int,int> size\t = %d\n", sizeof(t)); map<int,int> m; printf("map<int,int> size\t = %d\n", sizeof(m)); set<int> set; printf("set<int> size\t = %d\n", sizeof(set)); unordered_map<int,int> um; printf("unordered_map<int,int> size\t = %d\n", sizeof(um)); unordered_set<int> us; printf("unordered_set<int,int> size\t = %d\n", sizeof(us)); string str; printf("string size\t = %d\n", sizeof(string)); return 0; }