Struct-Zuweisung oder Memcpy? [duplicate]

Lesezeit: 3 Minuten

Benutzeravatar von ofaurax
ofaurax

Wenn ich eine Struktur in einer anderen (in C) replizieren möchte, was sind die Vor- und Nachteile von:

struct1 = struct2;

vs

memcpy(&struct1, &struct2, sizeof(mystruct_t));

Sind sie gleichwertig? Gibt es einen Unterschied in der Leistung oder Speichernutzung?

  • Achten Sie nur auf die Speicherzuweisung innerhalb der Struktur. Zum Beispiel, wenn Sie eine Struktur haben, die einen Zeiger auf eine Zeichenfolge enthält, und Sie Speicher für die Zeichenfolge zuweisen. Dieser Speicher wird nicht kopiert. Der Zeiger auf den Speicher wird kopiert, aber nicht der Speicher selbst. Mit anderen Worten, diese Art der Zuweisung ist keine tiefe Kopie. Weder ist Vanilla Memcpy für diese Mater. Es kann verwirrend werden, wem der zugewiesene Speicher gehört.

    – Pemdas

    21. März 2011 um 15:22 Uhr

  • Ich denke, diese Frage ist eher für Stackoverflow geeignet.

    – Karl Philipp

    21. März 2011 um 16:52 Uhr

  • Ich denke, diese Frage wurde hier bereits gut beantwortet: stackoverflow.com/q/4931123/176769

    – Karl Philipp

    21. März 2011 um 16:54 Uhr

Das struct1=struct2; Notation ist nicht nur prägnanter, sondern auch kürzer und lässt dem Compiler mehr Optimierungsmöglichkeiten. Die semantische Bedeutung von = ist eine Aufgabe, während memcpy kopiert nur Speicher. Das ist jedoch auch ein großer Unterschied in der Lesbarkeit memcpy verhält sich in diesem Fall genauso.

Verwenden =.

  • Hauptproblem bei s = mystruct zwischen struct s und struct * s. Beide funktionieren gut mit Equals, sodass Sie den Unterschied beim Lesen nicht erkennen können. *s gibt Ihnen identisch, während struct s Ihnen eine Kopie gibt. Wenn es an der Zeit ist, die Zuweisung(en) aufzuheben, funktioniert dies gut mit der identischen Struktur * s; aber es leckt mystruct, wenn Sie dummerweise nur einen Dealloc mit der struct s-Version machen. Es ist auch schneller, mit Zeigern zu arbeiten. Behalten Sie einfach im Hinterkopf, was Sie tun, und dann sollte alles in Ordnung sein. YMMV.

    – Drachen Lord

    7. März 2015 um 2:55 Uhr

Ich bin mir über den Leistungsunterschied nicht sicher, obwohl ich vermuten würde, dass die meisten Compiler memcpy unter der Haube verwenden würden.

Ich würde in den meisten Fällen die Zuweisung bevorzugen, sie ist viel einfacher zu lesen und macht deutlicher, was der Zweck ist. Stellen Sie sich vor, Sie hätten den Typ einer der Strukturen geändert, der Compiler würde Sie zu den erforderlichen Änderungen führen, entweder mit einem Compilerfehler oder mit einem Operator = (falls vorhanden). Wohingegen der zweite die Kopie blind machen würde, mit der Möglichkeit, einen subtilen Fehler zu verursachen.

Sehen Sie sich dieses Gespräch zum gleichen Thema an: http://bytes.com/topic/c/answers/670947-struct-assignment

Grundsätzlich gibt es viele Meinungsverschiedenheiten über die Eckfälle in diesem Thread darüber, was die Strukturkopie tun würde. Es ist ziemlich klar, ob alle Mitglieder einer Struktur einfache Werte sind (int, double usw.). Die Verwirrung kommt mit dem, was mit Arrays und Zeigern und Füllbytes passiert.

Alles sollte ziemlich klar sein, was mit dem passiert memcpy, da dies eine wörtliche Kopie jedes Bytes ist. Dazu gehören sowohl absolute Speicherzeiger, relative Offsets usw.

Es gibt keinen inhärenten Grund, warum die eine Leistung besser wäre als die andere. Verschiedene Compiler und Versionen davon können sich unterscheiden. Wenn Sie sich also wirklich interessieren, erstellen Sie ein Profil und Benchmarking und verwenden Fakten als Grundlage für Ihre Entscheidung.

Eine direkte Zuordnung ist klarer zu lesen.

Bei der Zuweisung ist es ein wenig riskanter, Fehler zu machen, sodass Sie den Strukturen Zeiger zuweisen und nicht den Strukturen, auf die verwiesen wird. Wenn Sie dies befürchten, stellen Sie sicher, dass Ihre Komponententests dies abdecken. Mir würde dieses Risiko egal sein. (Ähnlich, memcpy ist riskant, da Sie möglicherweise die Strukturgröße falsch angeben.)

1409300cookie-checkStruct-Zuweisung oder Memcpy? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy