Hat ein std::byte-Zeiger die gleichen Aliasing-Implikationen wie char*?

Lesezeit: 2 Minuten

C++ (und C) strenge Aliasing-Regeln beinhalten, dass a char* und unsigned char* kann ein Alias ​​für jeden anderen Zeiger sein.

AFAIK gibt es keine analoge Regel für uint8_t*.

Daher meine Frage: Was sind die Aliasing-Regeln für a std::byte Zeiger?

Die C++-Referenz ist derzeit nur spezifiziert:

Wie die Zeichentypen (char, unsigned char, signed char) kann er verwendet werden, um auf den von anderen Objekten belegten Rohspeicher zuzugreifen (Objektdarstellung), aber im Gegensatz zu diesen Typen ist er kein Zeichentyp und kein arithmetischer Typ.

  • de.cppreference.com/w/cpp/language/… Die gleichen Aliasing-Regeln gelten für std::byte wie zu char

    – Justin

    21. Apr. ’17 um 20:43


  • @Justin: Vielleicht möchten Sie etwas klarer sein, da “die Regeln gelten” nicht sagt, welche Regeln gelten. std::byte hat die gleichen Regeln wie char und unsigned char.

    – ShadowRanger

    21. Apr. ’17 um 20:45

  • @Justin: Nicht als du zum ersten Mal gepostet hast (du hattest: “en.cppreference.com/w/cpp/language/… Die Aliasing-Regeln gelten für .” std::byte“). Sie haben es seitdem bearbeitet; ich habe es vor der Bearbeitung geladen. Danke für die Korrektur.

    – ShadowRanger

    21. Apr. ’17 um 20:49


Hat ein stdbyte Zeiger die gleichen Aliasing Implikationen wie char
DeiDei

Aus dem aktuellen Standardentwurf ([basic.types]/2):

Für jedes Objekt (außer einem Unterobjekt der Basisklasse) vom trivial kopierbaren Typ T, unabhängig davon, ob das Objekt einen gültigen Wert vom Typ T enthält oder nicht, die zugrunde liegenden Bytes ([intro.memory]) aus denen das Objekt besteht, kann in ein Array von kopiert werden char, unsigned char oder std​::​byte
([cstddef.syn]).43 Wenn der Inhalt dieses Arrays zurück in das Objekt kopiert wird, soll das Objekt anschließend seinen ursprünglichen Wert behalten.

Also ja, für die drei Typen gelten die gleichen Aliasing-Regeln, genau wie cppreference zusammenfasst.

Es könnte auch wertvoll sein zu erwähnen ([basic.lval]/8.8):

Wenn ein Programm versucht, auf den gespeicherten Wert eines Objekts über einen anderen glvalue als einen der folgenden Typen zuzugreifen, ist das Verhalten undefiniert:

  • ein char, unsigned char oder std​::​byte-Typ.

.

215220cookie-checkHat ein std::byte-Zeiger die gleichen Aliasing-Implikationen wie char*?

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

Privacy policy