Saiz elemen jenis struktur yang diperolehi oleh
sizeof() tidak selalu sama dengan saiz setiap ahli individu. Kadangkala pengkompil menambah beberapa padding untuk mengelakkan masalah penjajaran. Jadi dimensi mungkin berubah. Padding ditambah apabila anggota struktur diikuti oleh anggota bersaiz lebih besar atau berada di hujung struktur. Penyusun yang berbeza mempunyai jenis kekangan penjajaran yang berbeza. Dalam standard C, jumlah struktur penjajaran adalah bergantung kepada pelaksanaan.
Dalam kes ini, z berganda ialah 8 bait panjang, iaitu lebih besar daripada x (4 bait). Jadi 4 bait lagi padding ditambah. Selain itu, data jenis pendek y mempunyai 2 bait ruang dalam ingatan, jadi 6 bait tambahan ditambah sebagai padding.
#include <stdio.h> struct myStruct { int x; //Integer takes 4 bytes, and padding 4 bytes double z; //Size of double is 8-byte, no padding short int y; //Size of short is 2-byte, padding 6-bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
Size of struct: 24
Dalam kes ini, pertama kali ganda dimasukkan, yang mengambil 8 bait ruang. Kini integer x (4 bait) ditambah. Jadi masih ada lagi 4 bait ruang. Selepas menambah y pendek, ia boleh dimasukkan ke dalam 4 bait ruang tambahan, mengambil sejumlah 16 bait ruang.
#include <stdio.h> struct myStruct { double z; //Size of double is 8-byte, no padding int x; //Integer takes 4 bytes, and padding 4 bytes short int y; //Size of short is 2-byte, padding 6-bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
Size of struct: 16
Kes ketiga juga menggunakan 16 bait ruang memori, tetapi disusun secara berbeza. Oleh kerana ahli pertama adalah berganda, ia diletakkan dahulu, dan kemudian data jenis pendek ditambah. Kini, apabila integer cuba dimasukkan, ia boleh diletakkan ke dalam kawasan 6-bait yang tinggal. Oleh itu, terdapat padding selepas pendek, tetapi tiada padding selepas data integer.
#include <stdio.h> struct myStruct { double z; //Size of double is 8-byte, no padding short int y; //Size of short is 2-byte, padding 6-bytes int x; //Integer takes 4 bytes, and padding 4 bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
Size of struct: 16
Atas ialah kandungan terperinci Mengapa dalam C/C++, saiz struktur tidak sama dengan jumlah saiz setiap ahli?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!