Natknąłem się na talk slide, a na stronie 12 znajduje się przykład ilustrujący trudność sprawdzania typu w obecności dziedziczenia.dlaczego ogromna różnica czasu kompilacji między g ++ a clang ++?
struct a {
typedef int foo;
};
struct a1 : a {};
struct a2 : a {};
#define X(b, a) \
struct a##1 : b##1, b##2 {}; \
struct a##2 : b##1, b##2 {};
X(a, b) X(b, c) X(c, d) X(d, e) X(e, f) X(f, g) X(g, h) X(h, i) X(i, j) X(j, k)
X(k, l) X(l, m) X(m, n) n1::foo main() {}
Po przerób to jest przekształcona na:
struct a {
typedef int foo;
};
struct a1 : a {};
struct a2 : a {};
struct b1 : a1, a2 {};
struct b2 : a1, a2 {};
struct c1 : b1, b2 {};
struct c2 : b1, b2 {};
struct d1 : c1, c2 {};
struct d2 : c1, c2 {};
struct e1 : d1, d2 {};
struct e2 : d1, d2 {};
struct f1 : e1, e2 {};
struct f2 : e1, e2 {};
struct g1 : f1, f2 {};
struct g2 : f1, f2 {};
struct h1 : g1, g2 {};
struct h2 : g1, g2 {};
struct i1 : h1, h2 {};
struct i2 : h1, h2 {};
struct j1 : i1, i2 {};
struct j2 : i1, i2 {};
struct k1 : j1, j2 {};
struct k2 : j1, j2 {};
struct l1 : k1, k2 {};
struct l2 : k1, k2 {};
struct m1 : l1, l2 {};
struct m2 : l1, l2 {};
struct n1 : m1, m2 {};
struct n2 : m1, m2 {};
n1::foo main() {}
kiedy przełożony zg ++ (Debian 4.9.1-16), to jednak pochłaniają dużo czasu:
$ time g++ type_check.cc
real 29.35s
user 29.34s
sys 0.00s
while clang ++ (clang version 3.4.2 (tags/RELEASE_34/dot2-final), x86_64-unknown-linux-gnu) robi to znacznie szybciej.
$ time clang++ type_check.cc
real 0.06s
user 0.04s
sys 0.00s
Dlaczego sprawdzić, czy rodzajów foo po obu stronach wielokrotnego dziedziczenia mecz koszt tyle czasu dla gcc/MTK, natomiast nie dla brzękiem?
Jakie wersje obu kompilatorów? – user657267
[FWIW potwierdził problem na ideone.com] To oczywiście złe programowanie - i dlaczego miałbyś się tym przejmować? Jeśli nie zamierzasz wykonywać tej pracy, aby znaleźć i naprawić to samodzielnie, po prostu zgłoś zgłoszenie błędu/problemu dla gcc i pozwól na to naprawić. Odpowiedź prawdopodobnie nie ma stałej wartości dla społeczności stackoverflow. –
@ user657267 dodano informacje o wersji. –