Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `sizeof(myStruct2)` Mengembalikan 12 Bait Manakala `sizeof(myStruct1)` Mengembalikan 6 Bait?

Mengapakah `sizeof(myStruct2)` Mengembalikan 12 Bait Manakala `sizeof(myStruct1)` Mengembalikan 6 Bait?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-26 10:01:03522semak imbas

Why Does `sizeof(myStruct2)` Return 12 Bytes While `sizeof(myStruct1)` Returns 6 Bytes?

Penjajaran Memori dalam Struktur C

Apabila berurusan dengan struktur dalam C, penjajaran memori memainkan peranan penting dalam mengoptimumkan penggunaan dan prestasi memori. Jika anda hairan dengan perbezaan penjajaran memori antara dua struct berikut:

<code class="c">typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct1;

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct2;</code>

di mana kedua-dua myStruct1 dan myStruct2 mempunyai saiz data gabungan yang sama iaitu 6 bait, tetapi myStruct2 melaporkan saiz 12 bait menggunakan sizeof(), jawapannya terletak pada penjajaran memori.

Pada kebanyakan mesin 32-bit, sempadan penjajaran biasanya 4 bait. Ini bermakna struktur diselaraskan dengan gandaan terdekat 4 bait. Dalam myStruct1, setiap ahli ialah 2 bait, jadi tiada padding dimasukkan di antara mereka dan saiz sebenar kekal pada 6 bait.

Walau bagaimanapun, dalam myStruct2, penambahan integer 4-bait (int) memerlukan Sempadan penjajaran 4-bait. Memandangkan 6 bait data awal daripada struct asal tidak sejajar dengan sempadan 4-bait, 2 bait padding dimasukkan antara v3 dan i. Pelapik ini memastikan bahawa saya bermula pada sempadan 4-bait, menghasilkan jumlah saiz 12 bait untuk myStruct2.

Ingat, dalam kebanyakan kes, struktur hanya diselaraskan dengan sempadan ahli terbesarnya. Dalam kes ini, ahli int dalam myStruct2 menentukan sempadan penjajaran, yang menerangkan perbezaan dalam penjajaran memori antara kedua-dua struktur.

Atas ialah kandungan terperinci Mengapakah `sizeof(myStruct2)` Mengembalikan 12 Bait Manakala `sizeof(myStruct1)` Mengembalikan 6 Bait?. 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