Warum C oder C ++ es nicht erlaubt, Array nach Werten zu übergeben, um zu funktionieren

8

C und C ++ ermöglicht die Übergabe von Struktur und Objekten nach Wert, obwohl die Übergabe von Arrays durch Werte verhindert wird, warum?

    
Kazoom 22.03.2009, 14:17
quelle

6 Antworten

18

In C / C ++ wird intern ein Array als Zeiger auf einen Speicherort übergeben, und im Prinzip wird als Wert übergeben. Die Sache ist, dass der kopierte Wert eine Speicheradresse für den gleichen Ort darstellt.

In C ++ wird übrigens ein vector<T> kopiert und an eine andere Funktion übergeben.

    
Mehrdad Afshari 22.03.2009 14:22
quelle
11

Sie können ein Array nach Wert übergeben, aber Sie müssen es zuerst in eine Struktur oder Klasse einbinden. Oder verwenden Sie einfach einen Typ wie std :: vector.

Ich denke, die Entscheidung war der Effizienz halber. Das möchte man die meiste Zeit nicht machen. Es ist die gleiche Überlegung, warum es keine unsignierten Doppelgänger gibt. Es gibt keine zugehörige CPU-Anweisung, daher müssen Sie in einer Sprache wie C ++ machen, was nicht effizient ist.

Wie @litb erwähnt: "C ++ 1x und Boost haben beide native Arrays in Strukturen verpackt, die std :: array und boost :: array bereitstellen, was ich immer bevorzugen würde, weil es das Übergeben und Zurückgeben von Arrays innerhalb von Strukturen erlaubt"

Ein Array ist ein Zeiger auf den Speicher, der dieses Array und die Größe enthält. Beachten Sie, dass es sich nicht genau um einen Zeiger auf das erste Element des Arrays handelt.

Die meisten Leute denken, dass Sie ein Array als Zeiger übergeben müssen und die Größe als einen separaten Parameter angeben müssen, aber das wird nicht benötigt. Sie können einen Verweis auf das eigentliche Array selbst übergeben, während der sizeof () - Status beibehalten wird.

%Vor%

Manche Leute sagen vielleicht, dass die Größe eines Arrays nicht bekannt ist. Das ist nicht wahr.

%Vor%

Aber was ist mit Zuweisungen auf dem Heap? Zuordnungen auf dem Heap geben kein Array zurück. Sie geben einen Zeiger auf das erste Element eines Arrays zurück. So neu ist nicht typsicher. Wenn Sie tatsächlich eine Array-Variable haben, wissen Sie, wie groß sie ist.

    
Brian R. Bondy 22.03.2009 14:18
quelle
8

EDIT: Ich habe die ursprüngliche Antwort unten gelassen, aber ich glaube, dass der meiste Wert jetzt in den Kommentaren ist. Ich habe es Community-Wiki gemacht, also wenn jemand, der an der folgenden Konversation beteiligt ist, die Antwort bearbeiten möchte, um diese Information widerzuspiegeln, fühlen Sie sich frei.

Ursprüngliche Antwort

Für eine Sache, wie würde es wissen, wieviel Stapel zuzuordnen ist? Das ist für Strukturen und Objekte (glaube ich) fest, aber bei einem Array hängt es davon ab, wie groß das Array ist, was bis zur Ausführungszeit nicht bekannt ist. (Selbst wenn jeder Aufrufer zur Kompilierungszeit wusste, könnte es verschiedene Aufrufer mit unterschiedlichen Array-Größen geben.) Sie könnten eine bestimmte Array-Größe in der Parameterdeklaration erzwingen, aber das erscheint ein bisschen seltsam.

Darüber hinaus, wie Brian sagt, geht es um Effizienz.

Was möchten Sie durch all dies erreichen? Will man sicherstellen, dass der Inhalt des ursprünglichen Arrays nicht verändert wird?

    
Jon Skeet 22.03.2009 20:46
quelle
4

Ich denke, dass es 3 Hauptgründe gibt, warum Arrays als Zeiger in C statt als Wert übergeben werden. Die ersten 2 werden in anderen Antworten erwähnt:

  • Effizienz
  • weil es keine Größeninformationen für Arrays im Allgemeinen gibt (wenn Sie dynamisch zugewiesene Arrays einschließen)

Aber ich denke, ein dritter Grund ist zurückzuführen auf:

  • die Entwicklung von C aus früheren Sprachen wie B und BCPL, wo Arrays tatsächlich als Zeiger auf die Array-Daten implementiert wurden

Dennis Ritchie spricht über die frühe Evolution von C aus Sprachen wie BCPL und B und insbesondere darüber, wie Arrays implementiert werden und wie sie von BCPL- und B-Arrays beeinflusst wurden und wie und warum sie unterschiedlich sind Array-Namen zerfallen in Ausdrücke in Ausdrücken).

Michael Burr 22.03.2009 17:41
quelle
3

Ich kenne keine Sprachen, die die Weitergabe von nackten Arrays nach Wert unterstützen. Dies zu tun wäre nicht besonders nützlich und würde schnell den Call-Stack chomp-up.

Bearbeiten: Um Downvoters - wenn Sie es besser wissen, lassen Sie es uns alle wissen.

    
anon 22.03.2009 14:27
quelle
3

Dies ist eine dieser "nur weil" Antworten. C ++ erbte es von C und musste es befolgen, um die Kompatibilität zu wahren. So wurde es in C aus Effizienzgründen gemacht. Sie würden selten eine Kopie eines großen Arrays erstellen (denken Sie daran, PDP-11 hier zu denken) auf dem Stapel, um es an eine Funktion zu übergeben.

    
Brian Neal 22.03.2009 16:42
quelle

Tags und Links