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

Mengapa Susunan Medan Struct Mempengaruhi Saiz Go Structs?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-21 03:39:09412semak imbas

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
}

Mencetak saiz struktur ini mendedahkan:

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

fmt.Println(unsafe.Sizeof(B{})) // Output: 16

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

Struktur dan Pembolehubah Saiz Sifar

type C struct {}

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])

Output:

0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c

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!

Kenyataan:
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