Mengapakah `sizeof(myStruct)` mengembalikan 6 bait dan bukannya 8 bait untuk struct dengan tiga ahli `unsigned short`?

Susan Sarandon
Lepaskan: 2024-10-26 19:17:02
asal
691 orang telah melayarinya

Why does `sizeof(myStruct)` return 6 bytes instead of 8 bytes for a struct with three `unsigned short` members?

Penjajaran Memori dalam Struktur C: Memahami Percanggahan Saiz

Apabila bekerja dengan struct C, penjajaran memori memainkan peranan penting dalam menentukan yang sebenar saiz struct dalam ingatan. Penjajaran memori merujuk kepada penempatan struktur data dalam alamat memori yang boleh dibahagikan dengan sempadan tertentu. Ini memastikan akses data yang cekap dan pengoptimuman prestasi.

Pertimbangkan mesin 32-bit di mana penjajaran memori biasanya ditetapkan kepada 4 bait. Dalam konteks ini, struct yang terdiri daripada beberapa ahli pendek yang tidak ditandatangani, seperti:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct;
Salin selepas log masuk

Seseorang menjangkakan saiz memori struct ini ialah 8 bait (3 x 2 bait). Walau bagaimanapun, operator sizeof(myStruct) hanya mengembalikan 6 bait. Percanggahan ini boleh dikaitkan dengan keperluan penjajaran.

Dalam contoh pertama, setiap ahli pendek menduduki 2 bait. Memandangkan sempadan penjajaran ialah 4 bait, tiada padding dimasukkan antara ahli. Oleh itu, jumlah saiz kekal pada 6 bait.

Sebaliknya, memperkenalkan ahli int kepada struct, seperti yang dilihat di bawah, mengubah tingkah laku penjajaran:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;
Salin selepas log masuk

Dalam kes ini, ahli int memerlukan sempadan penjajaran 4-bait. Untuk memastikan memenuhi keperluan ini, 2 bait padding dimasukkan antara ahli pendek yang tidak ditandatangani terakhir (v3) dan ahli int (i). Ini menghasilkan jumlah saiz 12 bait (6 bait data dalam pendek, 2 bait padding dan 4 bait data dalam int).

Oleh itu, perbezaan dalam saiz memori antara kedua-dua struct timbul daripada keperluan penjajaran jenis ahli mereka. Dalam struct pertama, sempadan penjajaran dipenuhi oleh ahli pendek itu sendiri, manakala dalam struct kedua, padding tambahan diperlukan untuk memenuhi sempadan penjajaran ahli int.

Atas ialah kandungan terperinci Mengapakah `sizeof(myStruct)` mengembalikan 6 bait dan bukannya 8 bait untuk struct dengan tiga ahli `unsigned short`?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!