003
02.10.2009, 15:36 Uhr
ao
(Operator)
|
Zitat: |
Bist du dir da sicher?
|
Ja, bin ich. Praktisch alle Compiler machen so was, z.B. hier:
C++: |
typedef struct _foo { char c; // auf Integer-Grenze // alignment gap: 3 Bytes (bei 32-Bit-CPU) int i; // auf der nächsten Integer-Grenze } foo;
|
Will man es anders (z.B. um TCP/IP-Headerstrukturen nachzuprogrammieren), dann gibts dazu Compiler-Optionen oder #pragma pack()-Statements oder irgendwas Ähnliches. Sollte man aber nur in solchen begründeten Fällen einsetzen, weil der entstehende Code grottig und imperformant sein kann.
Zitat: |
Weil ein struct mit memcpy zu initialisieren ist eigentlich etwas übliches
|
Der "übliche" Weg ist eher so:
C++: |
struct foo bar = { 1, 2, 3 }; // Initialisierung struct foo anotherbar; anotherbar = foo; // Zuweisung / Kopieren
|
und dabei berücksichtigt der Compiler das Alignment natürlich. Die memcpy-Variante
C++: |
memcpy (&anotherbar, &bar, sizeof (struct foo));
|
funktioniert deshalb, weil sizeof (struct foo) die tatsächliche Größe der Struktur im Speicher ist (Alignment-Gaps mitgezählt) und nicht nur die Summe der Member-Größen.
"Wildes" Kopieren (d.h. wenn bar und anotherbar nicht denselben Typ haben) ist Schweinkram. Kann klappen, kann aber auch böse ins Auge gehen. Dieser Post wurde am 02.10.2009 um 15:38 Uhr von ao editiert. |