1. 程式人生 > >struct位元組對齊問題

struct位元組對齊問題

// 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;
}