sizeof(结构体)地址对齐问题

写出sizeof(struct name2)的结果
struct name2{

char str;

int num;

short x;

}
写出sizeof(struct name1) 的结果

struct name1{

char str;

short x;

int num;

}
地址对齐不太会,求指教!

取决于对齐大小,比如缺省4字节对齐
struct name2{
char str; // 因为num要4字节,str本身1字节,但是为了对齐,所以占用4字节
int num; // 4字节
short x; // 同样,x本身2字节,占用4字节
}
4 + 4 + 4 = 12

struct name1{
char str; //占用1个字节
short x; // 占用后两个字节,为了对齐,填充1个字节
int num; //4字节
}

1+2+1+4 = 8

WinCE 下结构体占用空间的分析

贴出来一部分内容吧:
在学习过程中,注意到一些关于结构体占用内存空间大小(sizeof 与 padding byte)的问题,觉得挺有趣的。
在 WinCE 以前的小系统(嵌入式系统)编程时,特别注意内存的使用情况;但到了 WinCE 系统后,由于设备一般都有 128M(或更多)的内存,所以在内存的使用与优化上很多人已经不太注意。
嵌入式方面的程序员,还是有必要了解以下关于结构体占用空间这个问题。

[cpp] view plaincopy
typedef struct TwoBytes_S

{

char cOne;

char cTwo;

}TwoBytesEml;

typedef struct FourBytes_S

{

char cOne;

char cTwo;

char cThree;

char cFour;

}FourBytesEml;

typedef struct EightBytes_S

{

char cOne;

char cTwo;

char cThree;

char cFour;

char cFive;

char cSix;

char cSeven;

char cEight;

}EightBytesEml;

// 结构体实际占用的空间大小与结构体中占用空间最大的成员有什么关系?

// 结论: 结构体的大小为结构体中占用字节最大的成员的倍数。

// 对比 TestOder, TestOrder3 和 TestOder2 占用内存空间的情况

typedef struct TestOrder_S

{

char cFirst;

char cSecond;

int iFirst;

char cThird;

char cFourth;

}TestOrder;

typedef struct TestOrder2_S

{

int iFirst;

char cFirst;

char cSecond;

char cThird;

char cFourth;

}TestOrder2;

typedef struct TestOrder3_S

{

int iFirst;

char cFirst;

char cSecond;

char cThird;

}TestOrder3;

// 对比 TestShort 和 TestShortEml 占用内存空间的情况

typedef struct TestShort_S

{

char cOne;

short sAlign;

}TestShort;

typedef struct TestShortEml_S

{

char cOne;

TwoBytesEml sAlign;

}TestShortEml;

// 对比 TestInt 和 TestIntEml 占用内存空间的情况

typedef struct TestInt_S

{

char cOne;

int iAlign;

}TestInt;

typedef struct TestIntEml_S

{

char cOne;

FourBytesEml iAlign;

}TestIntEml;

// 对比 TestDouble 和 TestDoubleEml 占用内存空间的情况

typedef struct TestDouble_S

{

char cOne;

double dfAlign;

}TestDouble;

typedef struct TestDoubleEml_S

{

char cOne;

EightBytesEml dfAlign;

}TestDoubleEml;

// #define _USE_WINDOWS_CE_PLATFORM

void CalcSizeOfStruct(void)

{

#ifdef _USE_WINDOWS_CE_PLATFORM

RETAILMSG(1,(L"size of char is %d\r\n",sizeof(char)));

RETAILMSG(1,(L"size of short is %d\r\n",sizeof(short)));

RETAILMSG(1,(L"size of int is %d\r\n",sizeof(int)));

RETAILMSG(1,(L"size of long is %d\r\n",sizeof(long)));

RETAILMSG(1,(L"size of char * is %d\r\n",sizeof(char *)));

RETAILMSG(1,(L"size of float is %d\r\n",sizeof(float)));

RETAILMSG(1,(L"size of double is %d\r\n",sizeof(double));

// 对比 TestOder, TestOrder3 和 TestOder2 占用内存空间的情况  
RETAILMSG(1,(L"size of struct(char,char,int,char,char) is %d\r\n",sizeof(TestOrder)));  
RETAILMSG(1,(L"size of struct(int,char,char,char,char) is %d\r\n",sizeof(TestOrder2)));  
RETAILMSG(1,(L"size of struct(int,char,char,char) is %d\r\n",sizeof(TestOrder3)));  

// 对比 TestShort 和 TestShortEml 占用内存空间的情况  
RETAILMSG(1,(L"size of struct(char,short) is %d\r\n",sizeof(TestShort)));  
RETAILMSG(1,(L"size of struct(char,TwoBytesEml(char,char)) is %d\r\n",sizeof(TestShortEml)));  

// 对比 TestInt 和 TestIntEml 占用内存空间的情况  
RETAILMSG(1,(L"size of struct(char,int) is %d\r\n",sizeof(TestInt)));  
RETAILMSG(1,(L"size of struct(char,FourBytesEml(char,char,char,char)) is %d\r\n",sizeof(TestIntEml)));  

// 对比 TestDouble 和 TestDoubleEml 占用内存空间的情况  
RETAILMSG(1,(L"size of struct(char,double) is %d\r\n",sizeof(TestDouble)));  
RETAILMSG(1,(L"size of struct(char,EightBytesEml(char,char,char,char,char,char,char,char)) is %d\r\n",  
    sizeof(TestDoubleEml)));  

#else

printf("size of char is %d\r\n",sizeof(char));

printf("size of short is %d\r\n",sizeof(short));

printf("size of int is %d\r\n",sizeof(int));

printf("size of long is %d\r\n",sizeof(long));

printf("size of char * is %d\r\n",sizeof(char *));

printf("size of float is %d\r\n",sizeof(float));

printf("size of double is %d\r\n",sizeof(double));

// 对比 TestOder, TestOrder3 和 TestOder2 占用内存空间的情况  
printf("size of struct(char,char,int,char,char) is %d\r\n",sizeof(TestOrder));  
printf("size of struct(int,char,char,char,char) is %d\r\n",sizeof(TestOrder2));  
printf("size of struct(int,char,char,char) is %d\r\n",sizeof(TestOrder3));  

// 对比 TestShort 和 TestShortEml 占用内存空间的情况  
printf("size of struct(char,short) is %d\r\n",sizeof(TestShort));  
printf("size of struct(char,TwoBytesEml(char,char)) is %d\r\n",sizeof(TestShortEml));  

// 对比 TestInt 和 TestIntEml 占用内存空间的情况  
printf("size of struct(char,int) is %d\r\n",sizeof(TestInt));  
printf("size of struct(char,FourBytesEml(char,char,char,char)) is %d\r\n",sizeof(TestIntEml));  

// 对比 TestDouble 和 TestDoubleEml 占用内存空间的情况  
printf("size of struct(char,double) is %d\r\n",sizeof(TestDouble));  
printf("size of struct(char,EightBytesEml(char,char,char,char,char,char,char,char)) is %d\r\n",  
    sizeof(TestDoubleEml));  

#endif

}

// 第二部分 Leo.Zheng

struct TstStruct

{

char *p;

char c;

long x;

};

struct TstStruct2

{

char c; /* 1 byte /

char pad[7]; /
7 bytes /

char *p; /
4 bytes /

long x; /
4 bytes */

};

struct TstStruct3

{

char p; / 4 bytes /

char c; /
1 byte */

};

struct TstStruct4

{

short s; /* 2 bytes /

char c; /
1 byte */

};

struct TstStruct5

{

short s;

char c;

int flip:1;

int nybble:4;

int septet:7;

};

struct TstStruct6

{

char c;

struct Struct6_Sub

{

char *p;

short x;

} inner;

};

struct TstStruct6_R

{

struct Struct6_Sub

{

char *p;

short x;

} inner;

char c;

short s;

};

struct TstStruct7

{

char c;

struct TstStruct7 *p;

short x;

};

struct TstStruct8

{

struct TstStruct8 *p;

short x;

char c;

};

struct TstStruct9

{

struct foo7_inner

{

char *p;

short x;

} inner;

char c;

};

void CalcSizeOfStruct2(void)

{

#ifdef _USE_WINDOWS_CE_PLATFORM

RETAILMSG(1,(L"size of (struct TstStruct) = %d\n", sizeof(struct TstStruct)));

RETAILMSG(1,(L"size of (struct TstStruct2) = %d\n", sizeof(struct TstStruct2)));

RETAILMSG(1,(L"size of (struct TstStruct3) = %d\n", sizeof(struct TstStruct3)));

RETAILMSG(1,(L"size of (struct TstStruct4) = %d\n", sizeof(struct TstStruct4)));

RETAILMSG(1,(L"size of (struct TstStruct5) = %d\n", sizeof(struct TstStruct5)));

RETAILMSG(1,(L"size of (struct TstStruct6) = %d\n", sizeof(struct TstStruct6)));

RETAILMSG(1,(L"size of (struct TstStruct6_R) = %d\n", sizeof(struct TstStruct6_R)));

RETAILMSG(1,(L"size of (struct TstStruct7) = %d\n", sizeof(struct TstStruct7)));

RETAILMSG(1,(L"size of (struct TstStruct8) = %d\n", sizeof(struct TstStruct8)));

RETAILMSG(1,(L"size of (struct TstStruct9) = %d\n", sizeof(struct TstStruct9)));

#else

printf("size of (struct TstStruct) = %d\n", sizeof(struct TstStruct));

printf("size of (struct TstStruct2) = %d\n", sizeof(struct TstStruct2));

printf("size of (struct TstStruct3) = %d\n", sizeof(struct TstStruct3));

printf("size of (struct TstStruct4) = %d\n", sizeof(struct TstStruct4));

printf("size of (struct TstStruct5) = %d\n", sizeof(struct TstStruct5));

printf("size of (struct TstStruct6) = %d\n", sizeof(struct TstStruct6));

printf("size of (struct TstStruct6_R) = %d\n", sizeof(struct TstStruct6_R));

printf("size of (struct TstStruct7) = %d\n", sizeof(struct TstStruct7));

printf("size of (struct TstStruct8) = %d\n", sizeof(struct TstStruct8));

printf("size of (struct TstStruct9) = %d\n", sizeof(struct TstStruct9));

#endif

}

// 在 WinCE 上运行输出如下:

/*
size of char is 1
size of short is 2
size of int is 4
size of long is 4
size of char * is 4
size of float is 4
size of double is 8
size of struct(char,char,int,char,char) is 12
size of struct(int,char,char,char,char) is 8
size of struct(int,char,char,char) is 8
size of struct(char,short) is 4
size of struct(char,TwoBytesEml(char,char)) is 3
size of struct(char,int) is 8
size of struct(char,FourBytesEml(char,char,char,char)) is 5
size of struct(char,double) is 16
size of struct(char,EightBytesEml(char,char,char,char,char,char,char,char)) is 9

size of (struct TstStruct) = 12
size of (struct TstStruct2) = 16
size of (struct TstStruct3) = 8
size of (struct TstStruct4) = 4
size of (struct TstStruct5) = 8
size of (struct TstStruct6) = 12
size of (struct TstStruct6_R) = 12
size of (struct TstStruct7) = 12
size of (struct TstStruct8) = 8
size of (struct TstStruct9) = 12
*/

// 在 X86 上运行的输出如下:

/*
size of char is 1
size of short is 2
size of int is 4
size of long is 4
size of char * is 4
size of float is 4
size of double is 8
size of struct(char,char,int,char,char) is 12
size of struct(int,char,char,char,char) is 8
size of struct(int,char,char,char) is 8
size of struct(char,short) is 4
size of struct(char,TwoBytesEml(char,char)) is 3
size of struct(char,int) is 8
size of struct(char,FourBytesEml(char,char,char,char)) is 5
size of struct(char,double) is 16
size of struct(char,EightBytesEml(char,char,char,char,char,char,char,char)) is 9

size of (struct TstStruct) = 12
size of (struct TstStruct2) = 16
size of (struct TstStruct3) = 8
size of (struct TstStruct4) = 4
size of (struct TstStruct5) = 8
size of (struct TstStruct6) = 12
size of (struct TstStruct6_R) = 12
size of (struct TstStruct7) = 12
size of (struct TstStruct8) = 8
size of (struct TstStruct9) = 12
*/