2012-04-06 10 views
13

In den meisten Fällen, wenn ich eine optionale Funktion in C erstellen möchten, ich zwei Funktionen erstellen Sie einfach wie folgt aus:Warum behält GCC leere Funktionen?

#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 

Also, wenn das Symbol nicht definiert ist - wenn die Funktion deaktiviert ist - eine leere Funktion kompiliert wird in die ausführbare Datei.

in die Montage Auflistung Delving, scheint es, dass GCC compiliert und ruft die leeren Funktionen, wenn die Optimierungen deaktiviert sind. Wenn die Optimierungen aktiviert sind, auch mit -O2 und -O3, kompiliert es nur den erforderlichen Stapelverarbeitungscode, aber es optimiert die Aufrufanweisungen. Alles in allem behält es die Funktion.

Ungefähr dasselbe gilt für die nicht leeren, aber unbenutzten Methoden.

Es sollte einfach das ganze rauswerfen, aber es tut es nicht. Warum ist es das Standardverhalten? Und nur aus Neugier: Wie kann ich das beseitigen?

+0

"Wenn die Optimierungen aktiviert sind, kompiliert sie auch mit -O2 und -O3 nur den notwendigen Stapelverarbeitungscode, aber sie optimiert die Aufrufanweisungen." Bedeutet das, dass es auf diese Weise noch einen Overhead gibt? 'start_timer(); do_something(); stop_timer();' dauert länger als 'start_timer(); stop_timer();'? –

Antwort

24

Da die Funktion eine externe Verknüpfung hat (nicht static), kann der Compiler sie nicht eliminieren, weil eine andere Objektdatei darauf verweisen könnte. Wenn die Funktion static ist, wird sie vollständig eliminiert.

+4

Das lässt immer noch die Frage offen, warum GCC den Funktionskörper nicht einbindet (d. H. Den Aufruf weglässt), obwohl bekannt ist, dass der Körper leer ist. – duskwuff

+1

@duskwuff: Ich hatte statische Funktionen vom Compiler inline, so dass ich keine Haltepunkte auf ihnen setzen kann, auch wenn ich möchte. Es könnte jedoch von der Version von GCC oder der Plattform abhängen. Sonst weiß ich es nicht; Ich war nicht an der Entwicklung von GCC beteiligt und bin nicht in die Entscheidungen über solche Probleme eingeweiht. –

+1

Sie haben mich neugierig gemacht, also habe ich es selbst ausprobiert: Ich bin auf gcc 4.4.5 und mit -O3 (nur) Ich sehe keine leeren Funktionen (egal ob statisch oder nicht). – timday

1

Wenn Sie möchten, dass der Compiler die Funktion, die Sie ihm mitteilen müssen, schließlich inline einfügt. Erklären Sie Ihre Funktion inline, dies ermöglicht dem Compiler nicht, die Funktion zu emittieren, wenn es für richtig hält.

Nun kann dies zu einem "undefinierten Symbol" Fehler beim Kompilieren mit -O0 oder so führen. Setzen Sie eine "Instantiierung" wie

void do_something(int n, const char *s); 

in nur eine Übersetzungseinheit (C-Datei).

Verwandte Themen