#include <iostream>
using namespace std;
//結構體A
struct A
{
short num;
int math_grade;
float Chinese_grade;
double sum_grade;
}student1;
//結構體B
struct B
{
short num;
short math_grade;
char Chinese_grade;
double sum_grade;
}student2;
//結構體C
struct C
{
short num;
double sum_grade;
short math_grade;
char Chinese_grade;
}student3;
//結構體D
struct D
{
int a;
double b;
char c[9];
};
void main()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl;
cout<<"sizeof(B)="<<sizeof(B)<<endl;
cout<<"sizeof(C)="<<sizeof(C)<<endl;
cout<<"sizeof(C)="<<sizeof(D)<<endl;
}
/*輸出結果:sizeof(A)=24
sizeof(B)=16
sizeof(C)=24
sizeof(D)=32
首先,對於32位系統來說,編譯器在進行結構體大小計算時要遵循2個規則:
一、結構體變量中成員的偏移量必須是成員大小的整數倍(0被認為是任何數的整數倍)
二、結構體大小必須是所有成員大小的整數倍。
對於第一個結構體,
類型 大小 偏移量
short 2 0
int 4 2
float 4 4+2+2=8
double 8 12+4=16
size=8+16=24
對於第二個結構體,
類型 大小 偏移量
short 2 0
short 2 2
char 1 2+2=4
double 8 1+4+3=8
size=8+8=16
對於第三個結構體,
類型 大小 偏移量
short 2 0
double 8 2+6=8
short 2 16
char 1 2+16+18
這里,1+18=19,根據第二條規則,編譯器會在19的基礎上加5,使其變成24
struct D
{
int a; // 4個字節 (0-3)
double b; //8個字節 (8-15)
char c[9]; //9個字節 (16-24) 最后結構題的大小是8的倍數32 //
經典話:
結構體的總大小為結構體最寬基本類型成員大小的整數倍