pure/const-Funktion von Attributen in verschiedenen Compilern

Reine ist eine Funktion, Attribut, welches sagt, dass eine Funktion nicht ändern globalen Speicher.

const ist eine Funktion, Attribut, welches sagt, dass eine Funktion keine Lesen/ändern keine globalen Speicher.

Gegeben, dass die Informationen, die der compiler kann einige zusätzliche Optimierungen.

Beispiel für GCC:

float sigmoid(float x) __attribute__ ((const));

float calculate(float x, unsigned int C) {
    float sum = 0;
    for(unsigned int i = 0; i < C; ++i)
        sum += sigmoid(x);
    return sum;
}

float sigmoid(float x) { return 1.0f / (1.0f - exp(-x)); }

In diesem Beispiel der compiler könnte die Optimierung der Funktion berechnen zu:

float calculate(float x, unsigned int C) {
    float sum = 0;
    float temp = C ? sigmoid(x) : 0.0f;
    for(unsigned int i = 0; i < C; ++i)
        sum += temp;
    return sum;
}

Oder wenn Ihr compiler clever genug ist (und nicht so streng über Fließkommazahlen (floats):

float calculate(float x, unsigned int C) { return C ? sigmoid(x) * C : 0.0f; }

Wie kann ich markieren Sie eine Funktion in einer solchen Art und Weise für die verschiedenen Compiler, d.h. GCC, Clang, ICC, MSVC oder andere?

  • Für diejenigen von uns, die nicht mit gcc auf einer regelmäßigen basis, vielleicht kannst du eine Erklärung, was die Reine/const-Attribut ist. Wenn es sich um eine Optimierung von einer Art, ein Beispiel für C-oder C++ - code, für die es hilft dem compiler generieren mehr optimale Montage wäre auch hilfreich.
  • Ich bin kein compiler-Schriftsteller, aber es scheint mir, dass solch ein Attribut wäre unnötig, wenn die sigmoid() Funktion definition zur Verfügung Stand, ist der compiler vor der Analyse calculate() in der gleichen übersetzungseinheit. Egal, diese Attribute könnte sicherlich nützlich sein, wenn Sie die Funktion Definitionen sind in verschiedene übersetzungseinheiten.
  • Ja, GCC (und andere Compiler) automatisch hinzufügen dieses Attribut intern genau in diesem Fall. Und dann, auf der Grundlage der attribute, die Sie tun können, weitere Optimierungen (wie in meinem Beispiel). Und Sie genau trifft einer der wichtigsten Gründe für die Angabe, es gilt: Wenn der compiler nicht sieht, dass die definition an dieser Stelle oder, wenn die definition ist überhaupt nicht verfügbar, oder wenn Sie denken, dass es sicher ist, wenn der compiler reduziert die Menge der Aufrufe der Funktion.
InformationsquelleAutor Albert | 2010-05-09
Schreibe einen Kommentar