Rumah >pembangunan bahagian belakang >Golang >Penjelasan terperinci tentang penggunaan penjajaran bait dalam golang

Penjelasan terperinci tentang penggunaan penjajaran bait dalam golang

藏色散人
藏色散人ke hadapan
2021-09-10 16:42:152415semak imbas

Artikel ini diperkenalkan kepada anda oleh ruangan tutorial go language untuk memperkenalkan penjajaran bait golang saya harap ia dapat membantu rakan yang memerlukan.

Saya telah melakukan beberapa kerja pengoptimuman prestasi baru-baru ini, dan terdapat struktur yang menggunakan ruang yang agak besar dan nombor dalam ingatan adalah sangat istimewa Ramai, saya tertanya-tanya jika terdapat ruang untuk pengoptimuman, dan saya teringat penjajaran bait dalam bahasa C Dengan hanya melaraskan susunan medan, anda boleh menyimpan banyak memori 🎜>

Saiz data asas

Sebelum itu, mari kita lihat saiz data yang diduduki oleh jenis asas dalam golang

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)
    Walaupun hanya terdapat satu bit jenis bool, tetapi ia juga perlu menduduki 1 bait, kerana komputer ialah unit bait
  • 64 mesin, int menduduki 8 bait
  • jenis rentetan menduduki 16 bait , secara dalaman mengandungi penunjuk kepada data (8 bait) dan panjang int (8 bait)
  • jenis kepingan menduduki 24 bait, secara dalaman mengandungi penunjuk kepada data (bahagian 8 perkataan) dan panjang int (8 bait) dan kapasiti int (8 bait)
  • Jenis peta menduduki 8 bait dan merupakan penunjuk kepada struktur peta
  • Anda boleh menggunakan struct{} untuk mewakili kosong jenis. Jenis ini tidak menduduki sebarang ruang Gunakan ini sebagai nilai peta Anda boleh menggunakan peta sebagai satu set
Byte-aligned

struktur Medan dalam. body tidak disusun padat dalam ingatan, tetapi diselaraskan oleh bait Contohnya, jika int menduduki 8 bait, maka ia hanya boleh ditulis pada alamat yang berganda 8. Adapun mengapa bait diperlukan Penjajaran terutamanya untuk. sebab kecekapan. Selepas membaca prinsip yang lebih mendalam di Internet, saya rasa ia tidak begitu boleh dipercayai, jadi saya tidak akan bercakap kosong Jika anda berminat, anda boleh mengkajinya sendiri

// |x---|
So(unsafe.Sizeof(struct {
    i8 int8
}{}), ShouldEqual, 1)
Sekadar merangkum. an int8 Struktur, seperti int8, hanya menduduki 1 bait dan tidak mempunyai ruang tambahan

// |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)
Kandungan kedua-dua struktur adalah betul-betul sama Susunan medan telah dilaraskan, menjimatkan 33% daripada ruang.

// |x---|xxxx|xx--|----|xxxx|xxxx|
So(unsafe.Sizeof(struct {
    i8  int8
    i32 int32
    i16 int16
    i64 int64
}{}), ShouldEqual, 24)

// |x-xx|xxxx|xxxx|xxxx|
So(unsafe.Sizeof(struct {
    i8  int8
    i16 int16
    i32 int32
    i64 int64
}{}), ShouldEqual, 16)
Perlu diperhatikan di sini bahawa int64 hanya boleh muncul pada alamat gandaan 8, jadi dalam struktur pertama, 4 bait berturut-turut kosong

type I8 int8
type I16 int16
type I32 int32

So(unsafe.Sizeof(struct {
    i8  I8
    i16 I16
    i32 I32
}{}), ShouldEqual, 8)
Selepas menamakan semula jenis, saiz jenis tidak berubah

Untuk lebih banyak pengetahuan berkaitan golang, sila lawati

golanglajur tutorial!

Atas ialah kandungan terperinci Penjelasan terperinci tentang penggunaan penjajaran bait dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:segmentfault.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam