Forum: Compiler & IDEs std::start_lifetime_as : legales aliasing auf das alle gewartet haben?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Cplusminus (cplusminus)


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.

von Klaus (feelfree)


Lesenswert?

Was sind denn diese "aliasing-Probleme", die das Konstrukt löst?
Bisher wurde da halt wild gecastet, insofern sieht das jetzt schöner 
aus, aber funktional ändert sich doch nichts, oder?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Klaus schrieb:
> Was sind denn diese "aliasing-Probleme", die das Konstrukt löst

https://stackoverflow.com/a/99010/4730685

von Oliver S. (oliverso)


Lesenswert?

Niklas G. schrieb:
> Klaus schrieb:
>> Was sind denn diese "aliasing-Probleme", die das Konstrukt löst
>
> https://stackoverflow.com/a/99010/4730685

Genau das dort geschilderte Problem löst das aber doch auch nicht. Wenn 
im stream von aussen Daten mit inkompatiblen Aliasing reinkommen, dann 
ist das Aliasing inkompatibel.

Oliver

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Oliver S. schrieb:
> inkompatiblen Aliasing

Was meinst du damit?

von Markus F. (mfro)


Lesenswert?

Niklas G. schrieb:
> https://stackoverflow.com/a/99010/4730685
>

... ein ziemlich kaputter Stackoverflow-Eintrag.

von Mikro 7. (mikro77)


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)

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.