Können Sie eine Instanz einer Struktur einer anderen zuweisen, wie folgt:
struct Test t1;
struct Test t2;
t2 = t1;
Ich habe gesehen, dass es für einfache Strukturen funktioniert, aber funktioniert es für komplexe Strukturen?
Woher weiß der Compiler, wie Datenelemente abhängig von ihrem Typ kopiert werden, dh zwischen einem int
und einem String zu unterscheiden?
Ja, die Zuweisung wird für Strukturen unterstützt. Es gibt jedoch Probleme:
Jetzt zeigen die Zeiger beider Strukturen auf denselben Speicherblock - der Compiler kopiert nicht die Daten, auf die verwiesen wird. Es ist jetzt schwierig zu wissen, welcher Strukturinstanz die Daten gehören. Aus diesem Grund hat C ++ das Konzept der benutzerdefinierbaren Zuweisungsoperatoren erfunden. Sie können spezifischen Code schreiben, um diesen Fall zu behandeln.
quelle
struct
selbst werden klar kopiert.Schauen Sie sich zuerst dieses Beispiel an:
Der C-Code für ein einfaches C-Programm ist unten angegeben
Der äquivalente ASM-Code für foo_assign () lautet
Wie Sie sehen können, wird eine Zuweisung in der Baugruppe einfach durch eine Anweisung "mov" ersetzt. Der Zuweisungsoperator bedeutet einfach, Daten von einem Speicherort an einen anderen Speicherort zu verschieben. Die Zuweisung wird nur für unmittelbare Mitglieder einer Struktur ausgeführt und kann nicht kopiert werden, wenn Sie komplexe Datentypen in einer Struktur haben. Hier bedeutet KOMPLEX, dass Sie kein Array von Zeigern haben können, die auf Listen zeigen.
Ein Array von Zeichen innerhalb einer Struktur funktioniert auf den meisten Compilern selbst nicht. Dies liegt daran, dass die Zuweisung einfach versucht, zu kopieren, ohne den Datentyp als komplex anzusehen.
quelle
Dies ist eine einfache Kopie, genau wie Sie es tun würden
memcpy()
(tatsächlich erzeugen einige Compiler tatsächlich einen Aufrufmemcpy()
für diesen Code). Es gibt keine "Zeichenfolge" in C, nur Zeiger auf eine Reihe von Zeichen. Wenn Ihre Quellstruktur einen solchen Zeiger enthält, wird der Zeiger kopiert, nicht die Zeichen selbst.quelle
memcpy
, siehe hier: godbolt.org/z/nPxqWc - Aber jetzt, wenn ich identische Zeiger übergebea
undb
und*a = *b
in einmemcpy
undefiniertes Verhalten übersetzt wird, weil fürmemcpy
"Die Speicherbereiche dürfen sich nicht überlappen." (zitiert aus der Manpage). Ist der Compiler also falsch in der Verwendungmemcpy
oder bin ich falsch darin, eine solche Aufgabe zu schreiben?Meinten Sie "Komplex" wie in komplexer Zahl mit Real- und Imaginärteilen? Dies scheint unwahrscheinlich. Wenn nicht, müssten Sie ein Beispiel nennen, da "komplex" nichts Spezifisches in Bezug auf die C-Sprache bedeutet.
Sie erhalten eine direkte Speicherkopie der Struktur. ob Sie das wollen, hängt von der Struktur ab. Wenn die Struktur beispielsweise einen Zeiger enthält, zeigen beide Kopien auf dieselben Daten. Dies kann oder kann nicht sein, was Sie wollen; Das liegt an Ihrem Programmdesign.
Um eine "intelligente" Kopie (oder eine "tiefe" Kopie) durchzuführen, müssen Sie eine Funktion implementieren, um die Kopie auszuführen. Dies kann sehr schwierig zu erreichen sein, wenn die Struktur selbst Zeiger und Strukturen enthält, die auch Zeiger enthalten, und möglicherweise Zeiger auf solche Strukturen (vielleicht meinen Sie das mit "komplex"), und es ist schwer zu pflegen. Die einfache Lösung besteht darin, C ++ zu verwenden und Kopierkonstruktoren und Zuweisungsoperatoren für jede Struktur oder Klasse zu implementieren. Anschließend wird jede für ihre eigene Kopiersemantik verantwortlich. Sie können die Zuweisungssyntax verwenden und die Verwaltung ist einfacher.
quelle