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

#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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren