Frage

Ich habe den GNU Scientific Library Quellcode studiert und ich halte die folgende Art von Erklärungen zu sehen:

double cblas_ddot (const int N, const double * x, const int incx, const double * y, const int incy)

C99 , gibt es einen (optimizational) Nutzen ein Argument zu erklären, die von Wert übergeben wird (zB. N oder incy im Beispiel oben) const? Es ist eine Kopie davon gemacht sowieso, weil sie von Wert übergeben werden, ist es nicht?

Thx! Kornel

War es hilfreich?

Lösung

Es gibt wahrscheinlich keinen Nutzen für den Anrufer, sondern auch für den Angerufenen. einen Funktionsparameter const Deklarieren hat die gleiche positive Wirkung wie andere lokale Variablen const deklarieren, indem Sie auf sich selbst einen Fehler zur Einführung (als Programmierer der Funktion), wenn Sie dies zu ändern versuchen.

In nicht-so-smart-Implementierungen eine solche Erklärung könnte wahrscheinlich auch einen Einfluss auf die Entscheidung, ob eine Funktion inlined ist. Aber ich denke, dass heutzutage Compiler, eine solche Entscheidung zu treffen hat, was sie von der Definition der Funktion direkt ableiten.

Es kann sicherlich als eine Beschränkung der Sprache betrachtet, dass diese Spezifikation der Implementierung in seiner Schnittstelle zum Ausdruck kommt.

Andere Tipps

Ja. Die Option „const“ wird in der Regel in dem Zustand verwendet, dass, was auch immer an diese Funktion übergeben wird, nicht verändert werden. Compile-weise, gibt es keinen Unterschied. Es wird immer noch von Wert übergeben.

Wie schon andere gesagt haben, Funktionen auf diese Weise erklärt werden, so dass im Rahmen der Funktion, dass Variable nicht veränderbar sein und dabei, Ihr Compiler sollten Sie warnen.

Wie, warum Sie wollen, könnte dies tun, überlegen, was einen Zeiger geben können Sie tun - nämlich Sie den Zeigerdereferenzierung können Sie die Werte der Daten übergeben und bearbeiten haben, auf die sie verweist. const ist eine gute Art und Weise zu verhindern, dass sich versehentlich den Wert von etwas Bearbeitung der Anrufer denkt unverändert ist.

Mit dem Beispiel diesen:

#include <stdio.h>

void add(int* result, const int* x, int* y)
{
    *result = *x + *y;
    (*y)++; /* <-- the caller won't expect this! */

}

int main(int argc, char** argv)
{
    int a = 7;
    int b = 10;
    int c = 0;

    add(&c, &a, &b);

    printf("%d + %d = %d\n", a, b, c);
    return 0;
}

Dieser spuckt 7+11=17. Nun ist dies ein trivialer, nicht-schwerer Fall aber alle möglichen Dinge passieren könnte, waren uns auf etwas zu setzen wichtig ...

Wenn Sie const gegen die y-Variable halten, sollten Sie:

constexample.c: In der Funktion ‚Add‘: constexample.c: 7: 5: Fehler: Inkrement von Nur-Lese-Standort ‚* y‘

Bearbeiten, zur weiteren Klärung:

Ein guter Grund, einen const Typ für einen Nicht-Zeiger Variable zu deklarieren, ist für eine Variable, die die Größe von etwas darstellt, oder eine Variable, die den Maximalwert eines Arrays hält. Bedenken Sie:

int editstring(char* result, ..., const char* source, const size_t source_len);

Nun, sagen Sie zu sich selbst, aber ich würde nie bearbeiten source_len. Nun, sagen wir mal in Ihrem Algorithmus Sie aus irgendeinem Grund tun. Wenn die Änderung des Wertes von source_len erhöht, laufen Sie Gefahr, Speicher für den Zugriff über das, was Sie zugeordnet haben .. Einstellung const gibt es einen Compiler-Fehler erzeugen, wenn Sie versuchen, diesen Wert zu ändern.

Ich mag darauf hinweisen, in doppelten Unterstreichungen, dass const an die Compiler zu sagen, nur ein Weg ist, „Ich verspreche, diese nicht zu bearbeiten“. Es garantiert nicht, dass der Speicher ist schreibgeschützt, aber es ist eine Möglichkeit, Ihre Absicht, so dass Sie Fehler auffangen zu markieren. Wenn Sie es nicht zu ändern brauchen, erklären sie konst.

Und da Sie gefragt, die Montage, die von den beiden Versionen identisch ist.

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