On Sun, Nov 30, 2014 at 10:44:36PM +0100, m wrote:
> hai poi capito perché beccavi un segfault, quando cambiavi la
> definizione di fibonacci, rendendo la constexpr non terminante (ma
> compilante) ?
Nelle prove che ho fatto oggi, il segfault è dovuto al fatto che la
funzione è eseguita a runtime invece che espansa come constexpr, e
quindi segfaulta per aver riempito lo stack. Avevamo fatto uno stack
trace con gdb durante il talk?
Questo sorgente compila in un programma che non termina, con
qualunque livello di -O, perché forza la valutazione della constexpr a
compile time, e forse per tail call optimization, viene compilata
correttamente come loop infinito:
constexpr int rec(int n)
{
return rec(n);
}
const int a(rec(5));
int main()
{
return a;
}
Questo invece segfaulta o non termina a seconda dei livelli di -O: con
-O bassi, ignora constexpr e la compila come funzione, per cui
segfaulta per riempimento di stack. Con -O alti, rientra nel caso
precedente:
constexpr int rec(int n)
{
return rec(n);
}
int main()
{
return rec(5);
}
Tutto sommato, ora sembra avere un senso.
Ne approfitto per segnalare, invece di "break __cxa_throw" in gdb, un
piú comodo "catch throw". "help catch" in gdb mostra cose molto carine.
Enrico
--
GPG key: 4096R/E7AD5568 2009-05-08 Enrico Zini <enrico@xxxxxxxxxxxxxx>
signature.asc
Description: Digital signature
|