Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `sizeof(myStruct)` mengembalikan 6 bait dan bukannya 8 bait untuk struct dengan tiga ahli `unsigned short`?

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

Susan Sarandon
Susan Sarandonasal
2024-10-26 19:17:02692semak imbas

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;

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;

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!

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