std::start_lifetime_as : legales aliasing auf das alle gewartet haben?

OP #7726529
Lesenswert?
• ▲
▼

Mit C++23 kommt std::start_lifetime_as (https://en.cppreference.com/w/cpp/memory/start_lifetime_as)

Mit std::lifetime_as kann man jetzt legal Objekte im Speicher aliasen, wenn man es nur explizit angibt.

Beispiel aus dem C++ Paper P2590R2:

1
void process(Stream* stream) {
2
  std::unique_ptr<char[]> buffer = stream->read();
3
  if (buffer[0] == FOO)
4
    processFoo(std::start_lifetime_as<Foo>(buffer.get())); // OK
5
  else
6
    processBar(std::start_lifetime_as<Bar>(buffer.get())); // OK
7
}

GCC 14 kann es leider noch nicht >_>. Aber sobald dass in den Compilern ankommt, sollten doch alle Aliasing Probleme in C++ geklärt sein? Zusätzlich bekommt C++ ein weiteren Vorteil gegenüber C.

#7727343
Lesenswert?
• ▲
▼

Klaus schrieb:

Was sind denn diese "aliasing-Probleme"

In einem Satz:

The main thing the optimizer wants to know here is whether writes through one pointer might affect reads through other pointers or names.

https://langdev.stackexchange.com/questions/2998/what-optimizations-does-the-strict-aliasing-rule-facilitate

Der Zusammenhang zum Eingangspost erschließt sich mir auf Anhieb aber auch nicht. (weil gerade char* nicht betroffen sind)

(Firma: Torrox.de) #7730173
Lesenswert?
• ▲
▼

Cplusminus schrieb:

GCC 14 kann es leider noch nicht >_>. Aber sobald dass in den Compilern ankommt, sollten doch alle Aliasing Probleme in C++ geklärt sein? Zusätzlich bekommt C++ ein weiteren Vorteil gegenüber C.

Wenn in buffer[0] so etwas, wie ein Opcode steht, dann müsstest Du wahrscheinlich &buffer[1] verwenden.

In dem von Dir verlinkten Artikel steht doch explizit:

The behavior is undefined if: ... or the region is not suitably aligned for the T.

Demnach, müsste &buffer[1] das Alignment von Foo und Bar haben. Ob dem so ist, hängt dann doch wohl ganz stark von der Implementierung von stream->read() ab.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.