Code: Select all
auto buffer = new unsigned char[MAX_LEN];
auto hdr1 = new (buffer) Header1{ /* ... */ };
size_t pos1 = sizeof(Header1);
auto hdr2 = new (buffer + pos1) Header2{ /* ... */ };
size_t pos2 = pos1 + sizeof(Header2);
hdr2->data_len = fread(buffer + pos2, 1, MAX_LEN - pos2, stdin);
network_sendto(peer, buffer, pos2 + hdr2->data_len);
Der aktuelle Standard besagt Folgendes ([basic.types.general]):
Die Objektdarstellung eines vollständigen Objekttyps T ist die Folge von N ohne Vorzeichen char-Objekte, die von einem Nicht-Bitfeld-vollständigen Objekt vom Typ T eingenommen werden, wobei N gleich sizeof(T) ist. Die Wertdarstellung eines Typs T ist ...... Die Objekt- und Wertdarstellung eines vollständigen Nicht-Bitfeld-Objekts vom Typ T sind die Bytes bzw. Bits des Objekts, die der Objekt- und Wertdarstellung seines Typs entsprechen. ......
Wenn ich es richtig verstehe, sobald der Puffer Speicher für den Header bereitstellt, wird ein Teil davon („die Sequenz von N unsigned char Objekte") wird automatisch zur Objektdarstellung des Headers. Ich denke also, dass der Code gültig ist.
Und ein Codebeispiel am Ende dieser Antwort scheint ebenfalls zuzustimmen.
- Ist die obige Argumentation richtig? ? Weist der Code in einigen Aspekten UB auf?
- Ich würde auch gerne wissen, ob er noch gültig ist, wenn P1839 in den Standard aufgenommen wird. Denn dieses Papier scheint die Definition der Objektdarstellung zu berühren.