Rumah > pembangunan bahagian belakang > Golang > Mengapa Susunan Medan Struct Mempengaruhi Saiz Go Structs?

Mengapa Susunan Medan Struct Mempengaruhi Saiz Go Structs?

Mary-Kate Olsen
Lepaskan: 2024-12-21 03:39:09
asal
371 orang telah melayarinya

Why Does Struct Field Order Affect the Size of Go Structs?

Saiz Kesan Struktur Medan Berbeza

Dalam Go, susunan medan struct diisytiharkan boleh menjejaskan saiz struct. Mengapa?

Kajian Kes

type A struct {
    a bool
    b int64
    c int
}

type B struct {
    b int64
    a bool
    c int
}
Salin selepas log masuk

Mencetak saiz struktur ini mendedahkan:

fmt.Println(unsafe.Sizeof(A{})) // Output: 24

fmt.Println(unsafe.Sizeof(B{})) // Output: 16
Salin selepas log masuk

Walaupun ia mempunyai medan yang sama, saiznya berbeza.

Penjajaran dan Pelapik Medan

Sama ada medan diselaraskan atau bermula pada alamat memori tertentu bergantung pada seni bina sasaran. Sebagai contoh, int64 memerlukan penjajaran 8-bait. Dalam A, medan pertama ialah bool, iaitu 1 bait. Untuk menjajarkan b (int64) dengan betul, terdapat padding tersirat 7-bait selepas a.

Dalam B, memandangkan a diikuti oleh int (4 bait), hanya 3 bait padding diperlukan. Ini menerangkan perbezaan saiz.

// Offset (in bytes) for struct A
fmt.Println(unsafe.Offsetof(a.a)) // Output: 0
fmt.Println(unsafe.Offsetof(a.b)) // Output: 8
fmt.Println(unsafe.Offsetof(a.c)) // Output: 16

// Offset for struct B
fmt.Println(unsafe.Offsetof(b.b)) // Output: 0
fmt.Println(unsafe.Offsetof(b.a)) // Output: 8
fmt.Println(unsafe.Offsetof(b.c)) // Output: 12
Salin selepas log masuk

Struktur dan Pembolehubah Saiz Sifar

type C struct {}
Salin selepas log masuk

Saiz struct bersaiz sifar ialah sifar, menunjukkan tiada peruntukan memori. Walaupun pembolehubah berbeza merujuk struct bersaiz sifar, ia mungkin berkongsi alamat memori yang sama:

a := C{}
b := C{}
c := [0]int{}
d := [3]C{}

fmt.Printf("%p %p %p %p %p", &a, &b, &c, &d, &d[2])
Salin selepas log masuk

Output:

0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c
Salin selepas log masuk

Semua alamat adalah sama, menunjukkan tiada peruntukan memori untuk sifar ini -pembolehubah saiz.

Kesimpulan

Pemesanan medan struktur boleh memberi kesan kepada saiz disebabkan keperluan penjajaran dan padding tersirat. Struktur bersaiz sifar mengoptimumkan penggunaan memori dengan tidak memperuntukkan memori dan berkemungkinan berkongsi alamat yang sama untuk pembolehubah yang berbeza.

Atas ialah kandungan terperinci Mengapa Susunan Medan Struct Mempengaruhi Saiz Go Structs?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan