struct位元組對齊問題
阿新 • • 發佈:2019-01-29
// StructSize.cpp : 定義控制檯應用程式的入口點。 // // ConsoleApplication1.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> using namespace std; // 空結構,空類,都是1 struct S0 { }; /* 成員a型別char,偏移0,0是任何整數的整數倍,不補齊位元組。 maxSize:sizeof(char) == 1 totalSize: 1 , totalSize % maxSize == 0,末尾不補位元組 totalSize:1 */ struct S1 { char a; }; /* 成員a:型別char,偏移0,0%1==0,不補位元組。 成員b:型別char,偏移1=sizeof(a),1%1==0, 不補位元組。 maxSize: sizeof(char) == 1 totalSize: 1+1=2 , totalSize % maxSize == 0,末尾補位元組 +0 totalSize:2 */ struct S2 { char a; char b; }; /* totalSize:3 */ struct S3 { char a; char b; char c; }; /* 成員a:型別double,sizeof(double)==8,偏移0,0%8==0,不補位元組。 成員b:型別char,偏移:8=sizeof(a),8%1==0, 不補位元組。 maxSize: sizeof(double) == 8 totalSize: 8+1=9 , totalSize % maxSize != 0,末尾補位元組 +7 totalSize: 9+7 = 16 */ struct S4 { double a; char b; }; /* totalSize:8 */ struct S5 { int a; char b; }; /* 成員a:型別short,sizeof(short)==2,偏移0,0%2==0,不補位元組。 成員b:型別char,偏移:2=sizeof(a),2%1==0, 不補位元組。 maxSize: sizeof(short) == 2 totalSize: 2+1=3 , totalSize % maxSize == 3,末尾補位元組 +1 totalSize: 2+1+1 = 4 */ struct S6 { short a; char b; }; /* 成員a:型別short,sizeof(char)==1,偏移0,0%1==0,不補位元組。 成員b:型別int,偏移:1=sizeof(a),1%sizeof(int)==1, 補位元組 +3。 maxSize: sizeof(int) == 4 totalSize: 1+3+4=8 , totalSize % maxSize == 0,末尾補位元組 +0 totalSize:8 */ struct S7 { char a; int b; }; /* totalSize:16 */ struct S8 { double a; int b; }; /* 成員a:型別拆成5個char看,size==5,補位元組 +0。 成員b:型別int,偏移:5=sizeof(a),5%sizeof(int)==1, 補位元組 +3。 maxSize: sizeof(int) == 4 (注意不是sizeof(a)==5) totalSize: 5+3+4=12 , totalSize % maxSize == 0,末尾補位元組 +0 totalSize:12 */ struct S9 { char a[5]; int b; }; /* 成員a:3==sizeof(S3) 成員b:偏移:3=sizeof(a),3%sizeof(char)==0, 補位元組 +0。 maxSize: sizeof(char) == 1 (注意,包括S3最大的結構) totalSize: 3+1=4 , totalSize % maxSize == 0,末尾補位元組 +0 totalSize: 4 */ struct S10 { S3 a; char b; }; /* 成員a:16==sizeof(S4) 成員b:偏移:16=sizeof(a),16%sizeof(char)==0, 補位元組 +0。 maxSize: sizeof(double) == 8 (注意,包括S4最大的結構,double) totalSize: 16+1=17 , totalSize % maxSize == 1,末尾補位元組 +7 totalSize: 17+7=24 */ struct S11 { S4 a; char b; }; /* 成員a:8==sizeof(S5) 成員b:型別char,偏移:8=sizeof(a),8%sizeof(char)==0, 補位元組 +0。 maxSize: sizeof(int) == 4 (注意,包括S5最大的結構,int) totalSize: 8+1=9 , totalSize % maxSize == 1,末尾補位元組 +3 totalSize: 9+3=12 */ struct S12 { S5 a; char b; }; //sizeof(STemp1)==7 struct STemp1 { char a[7]; }; //sizeof(STemp2)==5 struct STemp2 { char a[5]; }; /* 成員a:7==sizeof(STemp1) 成員b:偏移:7=sizeof(a),7%sizeof(double)==7, 補位元組 +1。 maxSize: sizeof(double) == 8 totalSize: 7+1+8=16 , totalSize % maxSize == 0,末尾補位元組 +0 totalSize: 16 */ struct S13 { STemp1 a; double b; }; /* 成員a:1==sizeof(char) 成員b:偏移:1,1%sizeof(char)==0, 補位元組 +0 (STemp1 第一個成員是char,要分開來看) 成員c:偏移:8=1+sizeof(char)*7,8%sizeof(char)==0, 補位元組 +0 (STemp2 第一個成員是char,要分開來看) 成員d:偏移:13=8 +sizeof(char)*5,13%sizeof(doulbe)==5, 補位元組 +3 成員d:偏移:24=13+3 +sizeof(double),24%sizeof(char)==0, 補位元組 +0 maxSize: sizeof(double) == 8 totalSize: 25=24+1 , totalSize % maxSize == 1,末尾補位元組 +7 totalSize: 32 */ struct S14 { char a; STemp1 b; STemp2 c; double d; char e; }; /* 成員a:sizeof(char)==1 成員b:偏移:1=sizeof(a),1%sizeof(double)==1, 補位元組 +7。 成員c:偏移:16=1+7+8,16%sizeof(char)==0, 補位元組 +0。 成員d:偏移:17=16+1,17%sizeof(int)==1, 補位元組 +3。 成員e:偏移:24=17+3+4,24%sizeof(STemp2)==4, 補位元組 +1。 maxSize: sizeof(double) == 8 (所有結構中找) totalSize: 25 = 24+1 , totalSize % maxSize == 1,末尾補位元組 +7 totalSize: 32 = 25+7 */ struct S15 { char a; double b; char c; int d; STemp2 e; }; /* 成員a:1==sizeof(char)*3 成員b:偏移:3,1%sizeof(char)==0, 補位元組 +0 (S7 第一個成員是char,要分開來看) 成員c:偏移:11=3+sizeof(S7),11%sizeof(double)==3, 補位元組 +5 (S4 第一個成員是double,要分開來看) 成員d:偏移:32=11 + 5 +sizeof(S4),32%sizeof(int)==0, 補位元組 +0 (S4 第一個成員是int,要分開來看) 成員e:偏移:40=32 +sizeof(S5),40%sizeof(char)==0, 補位元組 +0 maxSize: sizeof(double) == 8 totalSize: 41=40+1 , totalSize % maxSize == 1,末尾補位元組 +7 totalSize: 48 */ struct S16 { char a[3]; S7 b; S4 c; S5 d; char e; }; int _tmain(int argc, _TCHAR* argv[]) { cout << "sizeof( S0 ) = " << sizeof(S0) << endl; cout << "sizeof( S1 ) = " << sizeof(S1) << endl; cout << "sizeof( S2 ) = " << sizeof(S2) << endl; cout << "sizeof( S3 ) = " << sizeof(S3) << endl; cout << "sizeof( S4 ) = " << sizeof(S4) << endl; cout << "sizeof( S5 ) = " << sizeof(S5) << endl; cout << "sizeof( S6 ) = " << sizeof(S6) << endl; cout << "sizeof( S7 ) = " << sizeof(S7) << endl; cout << "sizeof( S8 ) = " << sizeof(S8) << endl; cout << "sizeof( S9 ) = " << sizeof(S9) << endl; cout << "sizeof( S10 ) = " << sizeof(S10) << endl; cout << "sizeof( S11 ) = " << sizeof(S11) << endl; cout << "sizeof( S12 ) = " << sizeof(S12) << endl; cout << "sizeof( S13 ) = " << sizeof(S13) << endl; cout << "sizeof( S14 ) = " << sizeof(S14) << endl; cout << "sizeof( S15 ) = " << sizeof(S15) << endl; cout << "sizeof( S16 ) = " << sizeof(S16) << endl; return 0; }