Detaillierte Erläuterung der Verwendung der Byte-Ausrichtung in Golang

藏色散人
Freigeben: 2021-09-10 16:42:27
nach vorne
2376 Leute haben es durchsucht

Dieser Artikel wird Ihnen durch die Go-SpracheTutorial-Kolumne über Golang-Byte-Ausrichtung vorgestellt. Ich hoffe, dass er Freunden in Not hilfreich sein wird!

Eine der Strukturen nimmt relativ viel Platz ein und ich habe mich gefragt, ob es Raum für Optimierung gibt Wenn Sie die Byte-Ausrichtung in der C-Sprache verstehen, können Sie einfach die Reihenfolge der Felder anpassen. Diese Idee gilt auch für die grundlegende Datengröße. Schauen wir uns vorher die Größe an der von den darin enthaltenen Grundtypen belegten Daten

So(unsafe.Sizeof(true), ShouldEqual, 1)
So(unsafe.Sizeof(int8(0)), ShouldEqual, 1)
So(unsafe.Sizeof(int16(0)), ShouldEqual, 2)
So(unsafe.Sizeof(int32(0)), ShouldEqual, 4)
So(unsafe.Sizeof(int64(0)), ShouldEqual, 8)
So(unsafe.Sizeof(int(0)), ShouldEqual, 8)
So(unsafe.Sizeof(float32(0)), ShouldEqual, 4)
So(unsafe.Sizeof(float64(0)), ShouldEqual, 8)
So(unsafe.Sizeof(""), ShouldEqual, 16)
So(unsafe.Sizeof("hello world"), ShouldEqual, 16)
So(unsafe.Sizeof([]int{}), ShouldEqual, 24)
So(unsafe.Sizeof([]int{1, 2, 3}), ShouldEqual, 24)
So(unsafe.Sizeof([3]int{1, 2, 3}), ShouldEqual, 24)
So(unsafe.Sizeof(map[string]string{}), ShouldEqual, 8)
So(unsafe.Sizeof(map[string]string{"1": "one", "2": "two"}), ShouldEqual, 8)
So(unsafe.Sizeof(struct{}{}), ShouldEqual, 0)
Nach dem Login kopieren
Obwohl der Bool-Typ nur ein Bit hat, muss er auch 1 Byte belegen, da der Computer eine Byte-Einheit ist

64-Maschine, und ein int belegt 8 Wörter Abschnitt

String-Typ belegt 16 Bytes, enthält intern einen Zeiger auf Daten (8 Bytes) und die Länge eines int (8 Bytes).
  • Slice-Typ belegt 24 Bytes, enthält intern einen Zeiger auf Daten. Der Zeiger (8 Bytes) und die Länge eines int (8 Bytes) und die Kapazität eines int (8 Bytes)
  • Der Kartentyp belegt 8 Bytes und ist ein Zeiger auf die Kartenstruktur.
  • Kann struct{} verwenden, um einen leeren Typ darzustellen keinen Platz belegen. Sie können die Karte als Satz verwenden.
  • Byte-Ausrichtung
  • Die Felder in der Struktur sind nicht kompakt im Speicher angeordnet, sondern werden beispielsweise nach Bytes ausgerichtet Wenn int 8 Bytes belegt, kann es nur an eine Adresse geschrieben werden, die ein Vielfaches von 8 ist. Der Grund, warum eine Byteausrichtung erforderlich ist, dient hauptsächlich Effizienzüberlegungen. Ich habe die Theorie im Internet genauer gelesen, aber ich Ich glaube, es ist nicht sehr zuverlässig, deshalb werde ich keinen Unsinn reden. Wenn Sie interessiert sind, können Sie es selbst studieren. Kapseln Sie einfach eine int8-Struktur, die mit int8 identisch ist, nur 1 Byte einnimmt und kein zusätzliches Byte enthält Platz.
// |x---|
So(unsafe.Sizeof(struct {
    i8 int8
}{}), ShouldEqual, 1)
Nach dem Login kopieren
  • Die Feldreihenfolge wurde angepasst, wodurch 33 % des Platzes eingespart werden.
  • // |x---|xxxx|xx--|
    So(unsafe.Sizeof(struct {
        i8  int8
        i32 int32
        i16 int16
    }{}), ShouldEqual, 12)
    
    // |x-xx|xxxx|
    So(unsafe.Sizeof(struct {
        i8  int8
        i16 int16
        i32 int32
    }{}), ShouldEqual, 8)
    Nach dem Login kopieren
    Hier ist zu beachten, dass int64 nur bei Adressen erscheinen kann, die ein Vielfaches von 8 sind , also sind die ersten 4 aufeinanderfolgenden Bytes in der Struktur leer

    Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung der Byte-Ausrichtung in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:segmentfault.com
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage