Dlaczego GCC zachowuje puste funkcje?
W większości przypadków, jeśli chcę utworzyć opcjonalną funkcję w C, po prostu tworzę dwie takie funkcje:
<code>#ifdef OPTIONAL_SOMETHING void do_something(int n, const char *s) { while (n--) { printf("%s", s); } /* ...You might get the point, really do something... */ } #else void do_something(int n, const char *s) { /* Empty body */ } #endif </code>
Jeśli symbol jest nieokreślony - gdy funkcja jest wyłączona - pusta funkcja jest kompilowana do pliku wykonywalnego.
Zagłębiając się w listę zespołów, wygląda na to, że GCCkompiluje i dzwoni puste funkcje, gdyoptymalizacje są wyłączone. Jeślioptymalizacje są włączone, także z-O2
i-O3
, tokompiluje tylko niezbędny kod obsługi stosu, ale optymalizuje instrukcje wywołania. W sumie utrzymuje funkcję.
To samo dotyczy niepustych, ale nieużywanych metod.
Powinien po prostu wyrzucić całość, ale tak nie jest. Dlaczego jest to zachowanie domyślne? I tylko z ciekawości: jak mogę to wyeliminować?