2016-05-08 6 views

Antwort

4

Ersteres übergibt einen Zeiger auf die Struktur an die Funktion. Letzterer erstellt eine Kopie der Struktur und übergibt sie an die Funktion. Wenn die Struktur groß ist, ist das Erstellen einer Kopie für die Funktion teuer (verwendet viele Ressourcen), sollte also vermieden werden, es sei denn, es ist notwendig.

4

C übergibt struct s nach Wert. Was es bedeutet ist, dass die Funktion mit der zweiten Signatur eine Kopie des gesamten LargeStruct machen würde, um es an foo zu übergeben. Dies ist hinsichtlich der Speichernutzung nicht wirtschaftlich.

Was noch schlimmer ist, die Zuordnung von LargeStruct würde passieren in automatische Speicher (auch bekannt als "auf dem Stapel"). Abhängig von der tatsächlichen Größe Ihrer struct ist der Aufruf auf einigen Systemen möglicherweise nicht möglich, da dies zu einem Stapelüberlauf führen würde.

Der erste Ansatz, auf der anderen Seite, übergibt die struct per Zeiger. Die Größe des Zeigers hängt nicht von der Größe LargeStruct ab.

+0

Sollte der erste Satz umformuliert werden, zB "C übergibt Parameter nach Wert"? –

+0

@FiddlingBits Nicht wirklich: C macht eine Ausnahme für Arrays, die zu Zeigern zerfallen. – dasblinkenlight

3

Da C Argumente Wert vorbei, gibt es zwei wichtige Punkte:

  1. In Funktionskörper, erhalten Sie eine Kopie der übergebenen Parameter erhalten, so im Fall von void foo(LargeStruct struct);, erhalten Sie eine Kopie der Struktur, wenn Sie die Mitglieder der Struktur ändern, ist es eigentlich nicht draußen zu sehen, weil es eine temporäre Kopie ist, die zerstört wird, wenn die Funktion zurückkehrt. Wenn Sie also eine Struktur ändern wollen, müssen Sie einen Zeiger auf diese Struktur übergeben.

  2. Da Argumente kopiert und wenn die Struktur wirklich groß ist, gibt es einige Speicheraufwand. In diesem, wenn Sie die Struktur nicht ändern möchten, einfach den Speicher-Overhead zu minimieren, können Sie einen const Zeiger übergeben:

    foo(const LargeStruct *p);

Verwandte Themen