Sammelthread zu Visual C++’ Compiler

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Sammelthread zu Visual C++’ Compiler

Beitrag von Krishty »

Diese Tabelle aus dem neuen Post über NRVO erklärt so einiges – von

„warum ist C-style-Code schneller als C++?“

bis

„Warum ist return { x }; schneller als Foo bar = { x }; return bar;?“
copyelision.png
Überhaupt ist der ganze Artikel ein Schatz für Low-Level-Optimierer!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 574
Registriert: 05.07.2003, 11:17

Re: Sammelthread zu Visual C++’ Compiler

Beitrag von Lord Delvin »

Wieso macht es einen Unterschied ob Datenfluss durch eine benannte Variable geht?
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Sammelthread zu Visual C++’ Compiler

Beitrag von Schrompf »

Weil's laut C++ dann eine LValue ist, und dann kann's wegen Aliasing oder so nicht mehr so sicher ausgeschlossen werden, dass die irgendwo referenziert wird? Irgendwie so.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Sammelthread zu Visual C++’ Compiler

Beitrag von dot »

Weil's dann im Allgemeinen nicht mehr möglich ist, garantiert zu wissen, dass die Copy elided werden kann. Es kann ja beliebig viele Returns geben, die über beliebig komplexen Kontrollfluss erreicht werden können. Und nicht alle diese Returns müssen überhaupt die selbe Variable returnen… siehe auch die Beispiele aus dem C++ Team Blog Post. Klar, man könnte nun bestimmte Situationen spezifizieren, in denen die Sprache NRVO garantieren kann. Das wird aber sehr schnell sehr kompliziert und von fragwürdiger Sinnhaftigkeit…
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Sammelthread zu Visual C++’ Compiler

Beitrag von Krishty »

Ihr habt beide ein Bisschen Recht und beide ein Bisschen Unrecht. Ja; Lvalue wird der wichtigste Grund sein. (Verschiedene Return-Pfade und -Werte schafft man ja auch mit Rvalues, oder verstehe ich was falsch?) Wahrscheinlich wollten sie gerade so viel spezifizieren, dass gute Compiler und gebildete Entwickler optimalen Code generieren können; aber auch genau so wenig, dass es den Compiler-Entwicklern keine Kopfschmerzen macht. Und dann hat man halt die Low-Hanging Fruit in den Standard genommen, die sowieso schon jeder Compiler auf die eine oder andere Weise für POD implementiert hatte.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Sammelthread zu Visual C++’ Compiler

Beitrag von dot »

Krishty hat geschrieben: 28.10.2022, 21:11(Verschiedene Return-Pfade und -Werte schafft man ja auch mit Rvalues, oder verstehe ich was falsch?)

Code: Alles auswählen

X fun()
{
	X x;
	
	if (funfun(&x))
		return X(42);
	
	return x;
}
Was nun? Der Compiler kann x nicht in den Returnslot platzieren weil, im Falle dass das if genommen wird, muss er erst das Returnvalue konstruieren und danach x destroyen (die Konstruktoren und Destruktoren könnten über Seiteneffekte ihre Reihenfolge beobachten). Der Compiler kann gar nicht wissen welcher Pfad überhaupt genommen wird, ohne dass x zuerst konstruiert wurde, die Konstruktion von x kann daher auch nicht je nach Pfad in einem anderen Platz erfolgen. Sofern ich nichts übersehen habe, ist NRVO hier schlicht und einfach unmöglich, zumindest unter der Annahme, dass die Reihenfolge der Aufrufe aller relevanten Funktionen potentiell observable Behavior ist.

Wenn ich mich recht erinnere, gab es vor einiger Zeit ein Proposal, eine Untermenge von NRVO zu standardisieren. Das scheint aber nicht weit gekommen zu sein. Wie gesagt, es wird sehr schnell sehr kompliziert, NRVO über extrem triviale Fälle hinaus zu spezifizieren. Ich bezweifle stark, dass sich das rentiert.
Zuletzt geändert von dot am 28.10.2022, 23:22, insgesamt 3-mal geändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Sammelthread zu Visual C++’ Compiler

Beitrag von Krishty »

Super Beispiel; danke!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 574
Registriert: 05.07.2003, 11:17

Re: Sammelthread zu Visual C++’ Compiler

Beitrag von Lord Delvin »

Ah danke; was ich natürlich nicht mehr im Blick hatte, war dass man die Scope-based Deallokation in C++ hat, weswegen man im Compiler wohl nicht einfach beschließen kann, dass man eine Lifetime früher beendet, wenn der Wert danach nicht mehr verwendet wird. Ohne das wäre das Beispiel im Prinzip im if "return X(&x, 42)". Und bei dem ganzen Adressnevertaken-trivialdestruktor-Geraffel wird dann Krishtys Argumentation ziehen.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Sammelthread zu Visual C++’ Compiler

Beitrag von Krishty »

MSVC Machine-Independent Optimizations in Visual Studio 2022 17.7

Ich hatte schon gemerkt, dass meine Programme besser optimiert wurden – jetzt haben sie dazu endlich eine Erklärung abgegeben.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Sammelthread zu Visual C++’ Compiler

Beitrag von Krishty »

Wer hatte hier nochmal die Probleme bei der Optimierung von Byte Swaps? War es dot?
https://devblogs.microsoft.com/cppblog/msvc-backend-updates-since-visual-studio-2022-version-17-3/ hat geschrieben:
  • 17.4 improvements
    • Performance improvements that will help every architecture:
      • Improve bswap for signed integers.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten