Speicherverbrauch von Strukturen reduzieren



  • Frage
    Gibt es eine Möglichkeit den Speicherverbrauch von Strukturen in C# zu reduzieren?

    Antwort
    Seit .Net 2.0 optimieren die Compiler von C++, C# und VB das Layout von Structs nicht mehr in Bezug auf Größe. Dadurch sind Strukturen auf Grund des Alignments manchmal deutlich größer als sie sein müssten. Beispielsweise ist die Struktur

    struct BadValueType {
        char c1;    // offset 0
        int i;      // offset 4 (aligned)
        char c2;    // offset 8
    }
    

    12 Byte groß, während die äquivalente Struktur

    struct GoodValueType {
        int i;
        char c1;
        char c2;
    }
    

    nur 8 Bytes groß ist (gemessen mit sizeof und durch Anlegen großer Arrays). Die offizille Begründung ist, dass man weniger unerwartetes Verhalten hat, wenn man im unsafe Kontext mit Pointern rumhackt.

    Erreicht wurde diese Änderung dadurch, dass die Compiler jetzt standardmäßig das StructLayout-Attribut auf LayoutKind.Sequential setzen. Wer seine Strukturen nicht im unsafe-Kontext benutzt, kann von Hand das StructLayout-Attribut auf Auto setzen, so dass wieder die Optimierung stattfindet, die es bei .Net 1.x standardmäßig gab:

    using System.Runtime.InteropServices;
    
    	[StructLayout(LayoutKind.Auto)]
    	struct NowGoodValueType {
    		char c1;
    		int i;
    		char c2;
    	}
    

    Insbesondere wenn man größere Arrays von einer Struktur anlegt, kann man den GC damit erheblich entlasten, auch bei hoher Rekursionstiefe und Stack-Allokationen für diese Struktur mag es nützlich sein.
    Informationen sind entnommen aus http://msdn.microsoft.com/msdnmag/issues/05/01/MemoryOptimization/default.aspx

    Bis zum nächsten mal,
    euer freundlicher Ratgeber


Anmelden zum Antworten