Speicherverbrauch senken.



  • Strings (char-Array? std::string? CString? was anderes?) können ja ganz schön groß werden, je nachdem. Wie gesagt, sizeof verrät es dir.


  • Mod

    Zeig doch einfach mal was Du in der map speicherst. Ein paar Zeilen Code sprechen doch Bände!



  • Also sizeof liefert mir das ergebnis 56. Hilft das nun mein Problem zu lösen



  • Zeig doch einfach mal was Du in der map speicherst. Ein paar Zeilen Code sprechen doch Bände!
    

    Es sind doch nur ein paar Variablen. CString, bool, int, und das 10 Stück nichts weiter.



  • Ja genau wie bienchen mir zustimmt. Hilft das wenn du die Varibalen siehst. Oder was willst du sehen?


  • Mod

    Ist es. Man kann zumindest abschätzen wieviele andere Objekte mit erzeugt werden, bzw. wie groß die Basis-Struktur ist.



  • typedef struct tagITCADSSYMBOL
    {
    	tagITCADSSYMBOL()
    		:Comment("")
    		,Datatype(ADST_VOID)
    		,IndexGroup(0)
    		,IndexOffset(0)
    		,Name("")
    		,ShortName("")
    		,Size(0)
    		,SubSymbolCount(0)
    		,Type("")
    		{
    		}
    
    	CString			Comment;
    	long			IndexGroup;
    	long			IndexOffset;
    	CString			Name;
    	CString			ShortName;
    	int			Size;
    	int			SubSymbolCount;
    	CString			Type;	
    }ITcAdsSymbol;
    


  • Und sagt das nun was aus. Lässt sich damit nun das Problem lösen?



  • Für was habe ich nun den Quellcode gepostet. Habe ich doch gesagt bringt nichts.



  • sizeof bringt jedenfalls nix bei CString, da wird immer 4 Bytes zurückgegeben. Deine Struktur ist also wesentlich größer, abhängig davon, wie CString intern arbeitet und wie groß deine Strings sind. Wahrscheinlich wäre strlen(cs,GetBuffer())*sizeof(TCHAR) oder sowas sinnvoller...

    Vielleicht könnte es ja schon helfen, deine Strings zusammenzufassen (also alles in einem CString halten und per Trennzeichen trennen) oder so. Und müssen deine integralen Variablen alle so groß sein? Reicht da nicht vielleicht auch mal short oder char?



  • Und müssen deine integralen Variablen alle so groß sein? Reicht da nicht vielleicht auch mal short oder char?

    Ja müssen sie, die Struktur erhalte ich von einer externen Bibliothek. Und da sind die Variablen zum einen so angelegt und zum anderen werden sind die Werte auch sehr hoch.

    Das mit den Strings bringt aber eher weniger oder? Wenn ich hier nutzen gegen aufwand stelle!


  • Mod

    Also wenn Deine Strings kürzer als 16 bytes sind, dann ist es vermutlich effektiver und schneller die Strings direkt in der Struktur als char[] zu definieren.



  • Ok. Die Frage ist aber ob ich da immens Speicher einspare. Sagen wir mal halbieren. Wohl eher nicht oder? Bevor ich mir nun mein Programm umstellen!


  • Mod

    svenja schrieb:

    Ok. Die Frage ist aber ob ich da immens Speicher einspare. Sagen wir mal halbieren. Wohl eher nicht oder? Bevor ich mir nun mein Programm umstellen!

    Wie lang sind die Strings? Dir muss klar sein, dass jeder CString eine eigene Allokation bedeuetet und das bei kurzen Strings hier natürlich speicher vergeudet wird.

    Zusätzlich muss Dirklar sein, dass jede Allokation auf eine Granularität von 16 (soviel ich weiß) gerundet wird. Dazu kommen noch Zeiger für die Verkettung der Blöcke. D.h. evtl. kannst Du davon ausgehen, dass selbst ein kurzer String 32Bytes schluckt.

    Zudem, was musst Du da große umbauen.

    Du hast die Member der STruktur sicherlich mit Accessors (Gettern/Settern) gekapselt und die Datenmember sind private. Dann kannst Du das Format doch sofort ändern 🕶



  • Ok. Wie sieht es mit std::string aus geht das auch braucht der weniger Platz wie CString oder muss es char[] sein?



  • Du hast die Member der STruktur sicherlich mit Accessors (Gettern/Settern) gekapselt und die Datenmember sind private.

    Private??. Ich dachte in einer Struktur kann man keine Zugriffskontrolle mit private / public oder protected deklarieren?



  • Vielleicht solltest Du dir mehr Gedanken ums Design machen.

    Vielleicht braucht es ja Dein Programm aber Grundsätzlich bringt es nichts alles einzulesen wo es vielleicht in dem Moment sowieso nicht gebraucht wird.
    Vielleicht hilft auch eine Datenbank.



  • Vielleicht solltest Du dir mehr Gedanken ums Design machen.

    Was hat das Design damit zu tun. Ich habe die Daten und die brauchen Soeicherplatz. Und wenn du meinst ich muss das Design meiner Speicherung ändern. Das war ja anfänglich meine Frage.

    Vielleicht braucht es ja Dein Programm aber Grundsätzlich bringt es nichts alles einzulesen wo es vielleicht in dem Moment sowieso nicht gebraucht wird.

    Es wird alles benötigt. Ob ihr mir das nun glaubt oder nicht.

    Vielleicht hilft auch eine Datenbank.

    Klar würde die helfen. Ich habe aber keine zur Verfügung. Und hierüber brauchen wir auch gar nicht diskutieren. Geht nicht.


  • Mod

    svenja schrieb:

    Du hast die Member der STruktur sicherlich mit Accessors (Gettern/Settern) gekapselt und die Datenmember sind private.

    Private??. Ich dachte in einer Struktur kann man keine Zugriffskontrolle mit private / public oder protected deklarieren?

    Irrtum struct ist das selbe wie

    class myclass
    {
    public:
    ...
    };

    Auch hier gilt der OOP Ansatz... 😉

    Du kannst auch in struct Konstruktoren public/private etc verwenden.



  • std::string bringt mir übrigens + 100MB.


Anmelden zum Antworten