Größe einer Struktur



  • Wie groß darf eine Struktur in einer Winapi Anwendung maximal sein, bevor man mit malloc extra Speicher anfordern muß. Wie ermittelt man anhand der Strukturelemente die Größe der Struktur. Kann jemand helfen?



  • Die Größe ermittelst Du mit dem sizeof-Operator. Die Maximalgröße ist abhängig von der gewählten Stackgröße. Die darf nicht überschritten werden. IMHO ist die Standard-Stackgröße im VC 2005 auf 4 KB eingestellt (lässt sich auch noch irgendwie vergrößern, ob das Sinn macht ist was anderes). Bedenke aber auch, das dort noch andere Variablen Platz finden müssen 😉 .



  • Ich programmiere mit ms vc6.0, wie weiß ich beim definieren meiner Struktur ab wann ich Speicher per malloc zuweisen muß, da gibt es doch bestimmt irgendwelche Formeln oder?



  • Naja Du weißt doch, welche Variablen Du anlegen musst (auf dem Stack). Du darfst die Maximalgröße eben nicht überschreiten. Ne Formel ist mir nicht bekannt - wie stellst Du Dir das denn vor (mit der Formel) ?! 🙄



  • Naja z.B. diese Struktur:

    struct datensatz{
    	char	*name_1;
    	char	name_2[64];
    	int	zahl_1;
    	double	zahl_2
    };
    
    datensatz	daten[1000000];
    

    wenn ich sowas als Konsole programmiert habe, dann hat der Speicher nicht gereicht, also musste ich ihn mit malloc zuweisen, und mein Proggy ist gelaufen, wie ist das jetzt mit einer winapi Fensteranwendung.



  • CodeFinder schrieb:

    IMHO ist die Standard-Stackgröße im VC 2005 auf 4 KB eingestellt (lässt sich auch noch irgendwie vergrößern, ob das Sinn macht ist was anderes).

    Die default Stackgrösse unter Windows ist 1MB (!).

    Die 4KB sind was anderes, das ist die Grösse einer Page, und unter Windows muss man "Stack-Probes" machen wenn man in einer Funktion mehr als eine Page auf dem Stack braucht. Allerdings generiert jeder Windows C++ Compiler den Code für diese Stack-Probes selbst, das ist nix worum man sich selbst kümmern müsste.

    @Timmo: siehe oben: Stackgrösse ist normal 1MB. Da dein Array insgesamt wesentlich grösser als 1MB ist musst du es dynamisch anfordern. Global geht natürlich auch, nur aufm Stack wird das halt nix. Ob "console" oder "windowed" macht dabei keinen Unterschied.



  • Naja wie schon bereits gesagt, wie berechne ich den Spiecher den meine Struktur beansprucht.



  • Garnicht. Lass ihn dir doch ausrechnen (sizeof(datensatz) * array_groesse).

    Davon abgesehen kann die Struktur natürlich niemals kleiner sein als die Summe ihrer Elemente, also char* ist 4 Byte, char[64] ist 64 Byte, int nochmal 4 und double 8. Macht in Summe 4+64+4+8 = 80 Byte, und das mal 1 mio. ist ~80MB.
    Kann sich also niemals auf einem 1MB grossen Stack ausgehen.


Log in to reply