[Bug c++/96197] Excess memory consumption, positive correlation with the size of a constexpr array
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Jul 15 06:29:43 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96197
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Status|UNCONFIRMED |NEW
Last reconfirmed| |2020-07-15
Known to fail| |10.1.0, 11.0
Keywords| |memory-hog
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Does it help if you replace your simplistic O(n) algorithms with O(log n) ones?
That is,
constexpr const struct word_type &WORD_LOOKUP(WORD index, const struct
word_type *table_row =word_table) {
for (;;) {
if (table_row->index == index) return *table_row;
if (table_row->index == WORD::NONE) return word_lookup(WORD::NONE);
++table_row;
}
// return table_row->index == index ? *table_row : (table_row->index ==
WORD::NONE ? word_lookup(WORD::NONE) : WORD_LOOKUP(index, ++table_row));
}
replace the for (;;) loop with table_row[index] (OK, that's maybe too much
guessing into your data structure) or with a binary search over the table
which you keep sorted?
It's probably simply garbage that accumulates during constexpr evaluation.
-ftime-report shows
constant expression evaluation : 28.45 ( 92%) 1.57 ( 96%) 32.97 ( 92%)
5127882 kB (100%)
that is 5GB of GC memory from constexpr evaluation.
More information about the Gcc-bugs
mailing list