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 asasSebelum 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 berubahUntuk 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!