Bedeutet „Speicher bereitstellen“ die „Objektrepräsentation“?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Bedeutet „Speicher bereitstellen“ die „Objektrepräsentation“?

by Guest » 18 Jan 2025, 23:39

Bedenken Sie diesen Code:

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 Code soll die Objektdarstellung von Header1, gefolgt von der von Header2, gefolgt von den Benutzerdaten, an das Netzwerk senden.
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.

Top