Strukturenoptimierung durch MS VS C++



  • Alóha,
    es geht um die Strukturenoptimierung unter MS VS C++. Ja, ich habe bewusst
    MS VS C++ gesagt, weil anscheinend nur er die Strukturen optimiert. Und
    damit wär's auch schon gesagt, die Strukturen sollen NICHT optimiert
    werden. Habe alles mögliche von:

    #pragma OPTIMIZE OFF
    

    bishin zu:

    #pragma pack(push,1)
    

    versucht, doch nichts scheint zu klappen. Interessant dabei zu
    beobachten, parallel zu meinem Bitmapdecoder schreibe ich einen
    MD2-Modelloader der ebenfalls Strukturen einliesst. Das komische
    daran, bei beiden Projekten gibt es irgendwann die Fehlermeldung, wenn
    ich etwas aus den Daten auslesen möchte, dass wohl eine Access
    Vialation stattgefunden hat. Und bei beiden Projekten werden bei
    beiden Strukturinstanzen immer der Wert von '0xccccccc' angezeigt,
    welcher völlig unrealistisch für eine einfache Einlesung ist. Ich
    weiss nicht ob es nur bei mir so ist oder ob es überhaupt an MS VS C++
    liegt, meine Vermutung beruht aber darauf.

    Erste Access Vialation (Bitmapdecoder):

    bitmap_Image=new unsigned char[o_Bitmap.InfoHeader.biSizeImage];
    

    bitmap_Image ist ein Zeiger vom Datentyp 'unsigned char', o_Bitmap ist
    ein Objekt von der Klasse, InfoHeader (BITMAPINFOHEADER) ein Objekt
    der Struktur, die ausgelesen wird und 'biSizeImage' ist die Größe der
    Bilddaten in Byte.

    Die AV, Fehlermeldung dazu:

    Unbehandelte Ausnahme bei 0x7c81eb33 in Lesson1.exe: Microsoft C++-Ausnahme: std::bad_alloc an Speicherposition 0x0012f974..
    
    +		bitmap_Image	0xcccccccc <Schlechtes Ptr>	unsigned char *
    
    		biSizeImage	3435973836	unsigned long
    etc.
    

    Das einzige was mir bis jetzt in den Sinn kam war, dass die Struktur
    falsch eingelesen war (nicht der Fall), biSizeImage falsch definiert
    wurde (auch nicht der Fall) oder auf Speicher zugegriffen wird der
    nicht da ist (Oh net der Fall) und die Speicheradresseirung wird wohl
    auch nicht so hoch sein.

    Deswegen muss es meines Erachtens nach an der Optimierung liegen, die MS
    VS C++ automatisch durchführt und zwar bei Strukturen. Kann mir irgendein MS VS C++ Experte vielleicht Rat geben, macht langsam echt
    keinen Spaß mehr, weil es dauernd Ärger damit gibt.

    Vielen lieben Dank im Voraus!



  • std::bad_alloc lässt darauf schliessen, dass du zu viel Speicher angefordert hast, und kein neuer mehr allokiert werden konnte. Hast du denn im Debugger geschaut, wie viel Speicher du anforderst und was der Exception-String aussagt? Und die übergebenen Daten in den eckigen Klammern sind korrekt?

    Du kannst in den Projekt-Eigenschaften folgenden Eintrag ändern: C++ -> Codegenerierung -> Ausrichten der Strukturmember.
    Ich bin mir aber nicht sicher, ob das tatsächlich Auswirkungen hat, und weiss auch nicht, ob das Alignment zu den Compiler-Optimierungen zählt. Falls ja, sollte das im Debug-Modus sowieso deaktiviert sein.


  • Mod

    Das ist alles sehr wirr, und deine Schlussfolgerungen erfolgen eher ins Blaue hinein. Jedenfalls solltest du dir evtl. mal den konkreten Wert von o_Bitmap.InfoHeader.biSizeImage anschauen, schließlich ist 3435973836 auch nicht gerade klein...



  • camper schrieb:

    schließlich ist 3435973836 auch nicht gerade klein...

    3435973836 == 0xcccccccc == uninitialisiert (msvc++ debugging rtl).



  • Dann sollte das im Debug-Modus das Programm auch mit der entsprechenden Meldung unterbrechen ("The variable .. is being used without being intialized").



  • Erstmal vielen lieben Dank das so schnelle Antworten kamen.

    Wenn ich auf 'Ausrichten des Strukturmmember' klicke hab ich mehrere Optionen, ob ich zwischen 2, 4, 6, 8,...16 Byte etc. haben möchte. Was tun?


  • Mod

    way schrieb:

    Erstmal vielen lieben Dank das so schnelle Antworten kamen.

    Wenn ich auf 'Ausrichten des Strukturmmember' klicke hab ich mehrere Optionen, ob ich zwischen 2, 4, 6, 8,...16 Byte etc. haben möchte. Was tun?

    Gar nichts. Das ist nicht das Problem.



  • Der Dank geht nach vielen Tagen an RedEagle, nachdem wir ziemlich lange rumexperimentiert haben, haben wir, bzw. Er etwas herausgefunden, was gleichzeitig das Problem behoben hat. Und zwar musste mit fseek zu etwas gesprungen werden, bevor es eingelesen. Naja, die Art wie und was mir MS VS C++ da ausgeben hat war ja nicht viel informativer wie die Fehlermeldungen "Programm_xyz.exe musste aus einem ungeklrten Grund geschlossen werden-Problembericht senen".
    Trotzdem Danke ich Allen vielmals.



  • way schrieb:

    Der Dank geht nach vielen Tagen an RedEagle, nachdem wir ziemlich lange rumexperimentiert haben, haben wir, bzw. Er etwas herausgefunden, was gleichzeitig das Problem behoben hat. Und zwar musste mit fseek zu etwas gesprungen werden, bevor es eingelesen. Naja, die Art wie und was mir MS VS C++ da ausgeben hat war ja nicht viel informativer wie die Fehlermeldungen "Programm_xyz.exe musste aus einem ungeklrten Grund geschlossen werden-Problembericht senen".
    Trotzdem Danke ich Allen vielmals.

    Ein Hoch auf Mr. Allen RedEagle, Herausfinder des Monats. Während die C++-Nazis hier im Forum noch ihren std::schlagmichtot-Wahn ausleben, löst Allen die wahren Probleme im Alleingang, schnell und effizient. So wie Profis das nun mal tun.
    Auf den Tipp mit fseek hättest du hier ewig und drei Tage warten müssen!

    Danke, Allen!



  • Un trollo magnifico schrieb:

    Auf den Tipp mit fseek hättest du hier ewig und drei Tage warten müssen!

    seine fehlerbeschreibung war mies. das hätte sowieso niemand rausbekommen. sei doch nicht so unfair zu unserer std-doppel-doppelpünktchen-fraktion.
    🙂


Anmelden zum Antworten