Frage

Angenommen, ich habe eine Funktion

void do_something() {
    //....
    #ifdef FEATURE_X
        feature_x();
    #endif
    //....
}

Ich kann dies ohne Probleme kompilieren und ausführen.Wenn ich die Funktion möchte, kann ich darauf verzichten -D FEATURE_X und es funktioniert.

Aber was wäre, wenn ich es gerne hätte do_something in eine andere Datei kopieren (und diese Datei nicht jedes Mal neu kompilieren muss, wenn ich mich entscheide, die Option zu ändern).Wenn es in derselben Datei war, gehe ich davon aus

const int FEATURE_X=0;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

wird die Eliminierung von totem Code ordnungsgemäß nutzen und den Aufruf eliminieren.Wenn ich das in eine andere Datei füge, ohne LTO,

extern const int FEATURE_X;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

Der Code wird nicht entfernt (es gibt keine Möglichkeit, es zu wissen).Wenn also die Linkzeitoptimierung aktiviert ist, kann der Compiler den Wert von erkennen FEATURE_X Stellen Sie beim Link fest, ob der Code verwendet wird oder nicht, und entfernen Sie ihn gegebenenfalls.

War es hilfreich?

Lösung

GCC führt eine modulübergreifende Entfernung nicht erreichbarer Funktionen durch, kann jedoch nicht feststellen, dass der Code in Ihrem letzten Testfall tot ist, da der konstante Wert von FEATURE_X zu spät ermittelt wird.

Wenn Sie -D verwenden oder Ihre setzen const int FEATURE_X=0; in jedes Modul, dann wird der Code entfernt.

Andere Tipps

Wenn anstelle des referenzierten Codes:

generasacodicetagpre.

was ist, wenn es mit einer Verknüpfungszeitvariablen wie so gemacht wurde:

generasacodicetagpre.

dann in der Linker-Befehlsdatei definieren, definieren Sie

generasacodicetagpre.

würde es trotzdem geben, um es bei der Verbindungszeit zu optimieren?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top