[Bug libstdc++/85771] New: `std::variant<...>` insanely slow to compile compared to `union` (256 types)
vittorio.romeo at outlook dot com
gcc-bugzilla@gcc.gnu.org
Mon May 14 11:43:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85771
Bug ID: 85771
Summary: `std::variant<...>` insanely slow to compile compared
to `union` (256 types)
Product: gcc
Version: 8.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: vittorio.romeo at outlook dot com
Target Milestone: ---
Consider the following set of types:
struct Type0 { int x; };
struct Type1 { int x; };
struct Type2 { int x; };
// ...
struct Type253 { int x; };
struct Type254 { int x; };
struct Type255 { int x; };
Now imagine creating both a `std::variant` and a `union` out of them, then
compiling some code that prints out the active alternative with `-O3`:
union MyVariant { Type0 type0; /* ... */; Type255 type255; };
std::variant<Type0, /* ... */, Type255> v;
These are the *compilation time* results I get:
UNION
real 0m0.182s
user 0m0.104s
sys 0m0.068s
VARIANT
real 0m2.259s
user 0m1.960s
sys 0m0.280s
I can get similar results on widely different machines (40 core company
development box, my laptop, and an online compiler).
Fully-reproducible live demo on coliru:
http://coliru.stacked-crooked.com/a/65d2ec5f4d7eb1ca
I think that this kind of difference is unacceptable, and `std::variant` types
with a lot of alternatives can occur in realistic use cases. If we want to
promote safety and abstraction over C-style code, the compilation time costs
must be sane.
More information about the Gcc-bugs
mailing list