2015-07-19 11 views
5

Ich habe eine Struktur, sagen:Wie erhält man die Größe der Struktur und ihren Inhalt in Bytes in Golang?

type ASDF struct { 
    A uint64 
    B uint64 
    C uint64 
    D uint64 
    E uint64 
    F string 
} 

ich ein Stück dieser Struktur erstellen: a := []ASDF{}

ich Operationen auf dieser Scheibe der Struktur (Hinzufügen/Entfernen/Aktualisieren structs, die in Inhalt variieren) ; Wie kann ich die Gesamtgröße in Bytes (für Speicher) des Slice und seines Inhalts erhalten? Gibt es eine eingebaute, um dies zu tun, oder muss ich manuell eine Berechnung mit unsafe.Sizeof und dann len jede Zeichenfolge ausführen?

+0

Kurze Frage wird struct nicht 'ASDF' feste Größe, da Sie alle Variablentypen deklarieren? Dann kannst du einfach die Größe des Strukturzeigers von 'ASDF' mit' len (a) 'multiplizieren? Wie können Sie nur Elemente gleicher Größe in Slice anfügen? Oder verstehe ich falsch, wie Slice funktioniert? – Anzel

+0

Es würde jedoch ein Problem mit dem Feld "string" geben. –

Antwort

6

Summieren Sie die Größe des gesamten Arbeitsspeichers, mit Ausnahme von Garbage Collector und anderem Overhead. Zum Beispiel

package main 

import (
    "fmt" 
    "unsafe" 
) 

type ASDF struct { 
    A uint64 
    B uint64 
    C uint64 
    D uint64 
    E uint64 
    F string 
} 

func (s *ASDF) size() int { 
    size := int(unsafe.Sizeof(*s)) 
    size += len(s.F) 
    return size 
} 

func sizeASDF(s []ASDF) int { 
    size := 0 
    s = s[:cap(s)] 
    size += cap(s) * int(unsafe.Sizeof(s)) 
    for i := range s { 
     size += (&s[i]).size() 
    } 
    return size 
} 

func main() { 
    a := []ASDF{} 

    b := ASDF{} 
    b.A = 1 
    b.B = 2 
    b.C = 3 
    b.D = 4 
    b.E = 5 
    b.F = "ASrtertetetetetetetDF" 
    fmt.Println((&b).size()) 
    a = append(a, b) 

    c := ASDF{} 
    c.A = 10 
    c.B = 20 
    c.C = 30 
    c.D = 40 
    c.E = 50 
    c.F = "ASetDF" 
    fmt.Println((&c).size()) 
    a = append(a, c) 

    fmt.Println(len(a)) 
    fmt.Println(cap(a)) 
    fmt.Println(sizeASDF(a)) 
} 

Ausgang:

69 
54 
2 
2 
147 

http://play.golang.org/p/5z30vkyuNM

1

Ich habe Angst zu sagen, dass unsafe.Sizeof der Weg ist, hier zu gehen, wenn Sie überhaupt ein Ergebnis erhalten möchten. Die Speichergröße einer Struktur ist nichts, auf das Sie sich verlassen sollten. Beachten Sie, dass auch das Ergebnis von unsafe.Sizeof ungenau ist: Die Laufzeit kann den Daten Kopfzeilen hinzufügen, die Sie bei der Garbage Collection nicht beachten können.

Für Ihr spezielles Beispiel (eine Cache-Größe finden) empfehle ich Ihnen, mit einer statischen Größe zu gehen, die für viele Prozessoren sinnvoll ist. In fast allen Fällen wird sich eine solche Mikrooptimierung nicht auszahlen.

+0

Die Funktion ['len (...)'] (http://golang.org/pkg/builtin/#len) scheint nur mit Arrays, Strings, Slices und Kanälen zu funktionieren. Keine Hilfe mit Structs = ( – maerics

+0

@maerics Nur um ein besseres Verständnis von dem, was Sie erreichen wollen, was glauben Sie, dass diese Informationen nützlich für? – fuz

+0

@ FUZxxl: keine Ahnung, fragen OP =) Ich bin nur kommentieren von der Erdnussgalerie – maerics

Verwandte Themen