Visual C++ optimiert double member weg
-
Guten Morgen, ich habe seit einiger Zeit das Problem, dass ich im Debugger von Visual Studio nicht mehr in double member gucken kann. Hier ein paar Zeilen Code.
struct A { double a = 1.0; double b = 2.0; }; struct N { double x = 0; double y = 0; }; N create(const A& a) { N n; n.x = a.a; n.y = a.b; return n; } int main() { A a; N n = create(a); }
Wenn ich in
create
einen Breakpoint setze, sieht das alles uninitialisiert aus, bzw. als ob man versuchen würde in optimierten Code zu debuggen.
Den Rückhabewert voncreate
inmain
kann ich mir dann wieder im Debugger angucken.
Wenn ich diedouble
aufint
ändere, funktioniert das auch increate
problemlos.
Die Flags sind alle default Flags für Debug bei einem neuen VS Kommandozeilen Projekt, abgesehen vom C++ Standard, das habe ich auf/std:c++latest
Also: compiliert wird mit/Od
(Optimization disabled) und/ZI
(Program Database for Edit And Continue).Ich habe Visual Studio 2022 Professional Version 4.8.04084.
Hat das Problem noch jemand? Kennt jemand abhilfe?
-
@Schlangenmensch Bei mir (VS 2022 Preview) funktioniert alles wie gewohnt. Vielleicht musst du deine Installation reparieren?
-
@Tyrdal Ein Kollege hat mit der selben Version das selbe Problem. Ich habe aber gesehen, dass es ein Update gibt, dass lasse ich mir mal installieren (der Ärger mit Konzernen, da darf man nix selbst)
-
@Schlangenmensch gibt bei euch keine Admin Privilegen um so zeugst zu installieren?
-
@SoIntMan Nope. Ich kann die nur temporär beantragen... ist immer mit 'nem Mordsaufwand verbunden.
Hab mal 'ne Zeitlang versucht in einer VM zu arbeiten, aber die Performanceeinbußen haben mich davon wieder weggetrieben.
-
In create wird vermutlich NRVO gemacht und der Speicher von n ist da gar nicht vorhanden sondern erst in der main.
-
@Tyrdal Wäre auch meine Vermutung. Hätte aber erwartet, dass das in einem Debug Build nicht passiert.
Erklärt aber auch nicht, warum das nur bei
double
Member passiert und nicht beiint
Member.
-
@Schlangenmensch Geht mir genauso. Aber in clang wird das auch schon vom Frontend gemacht und nicht erst vom Optimierer, von daher ...
-
@Schlangenmensch sagte in Visual C++ optimiert double member weg:
@Tyrdal Wäre auch meine Vermutung. Hätte aber erwartet, dass das in einem Debug Build nicht passiert.
Erklärt aber auch nicht, warum das nur bei
double
Member passiert und nicht beiint
Member.Ok, das ist merkwürdig.
-
@Schlangenmensch probier mal den Schalter "/Zc:nrvo-". Der schaltet NRVO aus.
-
@Tyrdal Ändert nichts an dem Verhalten
-
@Schlangenmensch Hm, Ich habs mit VS 17.4.4 probiert. Ohne den Schalter war das struct tatsächlich nicht initialisiert (in der create), mit aber schon und alles wird normal angezeigt. Bist du sicher, dass du das an der richtigen Stelle gesetzt hast?
-
@Schlangenmensch sagte in Visual C++ optimiert double member weg:
Ändert nichts an dem Verhalten
Eine dumme Frage: Hast du schon ein neues Projekt zu Testzwecken erzeugt und dann den Code hineinkopiert?
So sind mir schon einige falsche Compilerflags aufgefallen.
-
@Quiche-Lorraine Aufgefallen ist mir das in einem "echten" Projekt. Getestet habe ich den Code oben dann in einem Ausprobier/Spielprojekt.
Nochmal ein ganz neues Projekt wäre auch noch eine Idee, aber erst für Montag
-
@Tyrdal hm, ich habe das ins freie Feld für sonstige Compilerflags eingetragen, in den Projektsettings unter dem Feld, in dem der gesamte Kommandozeilenaufruf angegeben ist.
-
@Schlangenmensch Da gehörts auch hin. Ich frage nur, weil ich schon mal versehentlich sowas beim Linker eingetragen hab und das war natürlich Mist.
-
@Quiche-Lorraine Hab gerade eine neue Solution mit einem neuen Projekt erstellt, mit dem selben Ergebnis.
@Tyrdal: Mit dem Flag geht's doch. War am Freitag wohl etwas zu müde und mir ist das "-" bei dem Flag durchgegangen. Ich bin trotzdem verwundert, dass nur bei
double
Membern da optimiert wird.