https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118809
Bug ID: 118809
Summary: Excessive memory usage with global
std::vector<std::vector<...>> in C++20 mode
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: daklishch at gmail dot com
Target Milestone: ---
Created attachment 60434
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=60434&action=edit
Minified reproducer
We've been running a competitive programming contest where there are tight
limits on compile time time and memory usage (10s/512Mb) to protect testing
system from DoS. During the contest, I've noticed that one of the submissions
that wasn't doing anything extraordinary is getting the "compile time memory
limit exceeded" verdict. The culprit was the following global variable:
`std::vector r(1, std::vector<int>(1e5));`. Notice how GCC uses up almost 440Mb
when trying to compile translation unit with just this single vector:
$ cat orig.cpp
#include <vector>
std::vector r(1, std::vector<int>(1e5));
$ /bin/time ~/gcc-15-trunk/bin/g++ -c -std=c++20 orig.cpp -o /dev/null
2.90user 0.04system 0:02.94elapsed 99%CPU (0avgtext+0avgdata
437876maxresident)k
0inputs+0outputs (0major+7005minor)pagefaults 0swaps
compared to ~70Mb with C++17:
$ /bin/time ~/gcc-15-trunk/bin/g++ -c -std=c++17 orig.cpp -o /dev/null
0.15user 0.01system 0:00.17elapsed 99%CPU (0avgtext+0avgdata 66716maxresident)k
0inputs+0outputs (0major+3475minor)pagefaults 0swaps
What makes me believe this is a bug and not a consequence of constexpr changes
in C++20 is the fact that commenting out lines 77-78 (check for allocation size
overflow) in the minified reproducer drops memory usage from ~400Mb to ~60Mb.
And to that extend, doing almost any further non-trivial manual inlining in the
reproducer makes peak memory usage go down significantly.