Mengapa dalam C/C++, saiz struktur tidak sama dengan jumlah saiz setiap ahli?

PHPz
Lepaskan: 2023-08-26 09:29:07
ke hadapan
828 orang telah melayarinya

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.

Kes 1

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.

Mengapa dalam C/C++, saiz struktur tidak sama dengan jumlah saiz setiap ahli?

Contoh kod

#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));
}
Salin selepas log masuk

Output 2

Size of struct: 24
Salin selepas log masuk

Kes 2

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.

Mengapa dalam C/C++, saiz struktur tidak sama dengan jumlah saiz setiap ahli?

Contoh kod

#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));
}
Salin selepas log masuk

Output 2

Size of struct: 16
Salin selepas log masuk
Salin selepas log masuk

Kes 3

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.

Mengapa dalam C/C++, saiz struktur tidak sama dengan jumlah saiz setiap ahli?

Contoh kod

#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));
}
Salin selepas log masuk

Output 2

Size of struct: 16
Salin selepas log masuk
Salin selepas log masuk

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!

Label berkaitan:
sumber:tutorialspoint.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan