WinCE 下结构体占用空间问题的分析
扫描二维码
随时随地手机看文章
年前辞职了,准备年后找工作。
所以在网上查找一下 C/C++ 基础方面的面试题,个人感觉这方面还是要准备一下。
虽然后面的应聘没有用到所准备的这些,算是学习一下。
在学习过程中,注意到一些关于结构体占用内存空间大小(sizeof 与 padding byte)的问题,觉得挺有趣的。
在 WinCE 以前的小系统(嵌入式系统)编程时,特别注意内存的使用情况;但到了 WinCE 系统后,由于设备一般都有 128M(或更多)的内存,所以在内存的使用与优化上很多人已经不太注意。
嵌入式方面的程序员,还是有必要了解以下关于结构体占用空间这个问题。
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 %drn",sizeof(char))); RETAILMSG(1,(L"size of short is %drn",sizeof(short))); RETAILMSG(1,(L"size of int is %drn",sizeof(int))); RETAILMSG(1,(L"size of long is %drn",sizeof(long))); RETAILMSG(1,(L"size of char * is %drn",sizeof(char *))); RETAILMSG(1,(L"size of float is %drn",sizeof(float))); RETAILMSG(1,(L"size of double is %drn",sizeof(double)); // 对比 TestOder, TestOrder3 和 TestOder2 占用内存空间的情况 RETAILMSG(1,(L"size of struct(char,char,int,char,char) is %drn",sizeof(TestOrder))); RETAILMSG(1,(L"size of struct(int,char,char,char,char) is %drn",sizeof(TestOrder2))); RETAILMSG(1,(L"size of struct(int,char,char,char) is %drn",sizeof(TestOrder3))); // 对比 TestShort 和 TestShortEml 占用内存空间的情况 RETAILMSG(1,(L"size of struct(char,short) is %drn",sizeof(TestShort))); RETAILMSG(1,(L"size of struct(char,TwoBytesEml(char,char)) is %drn",sizeof(TestShortEml))); // 对比 TestInt 和 TestIntEml 占用内存空间的情况 RETAILMSG(1,(L"size of struct(char,int) is %drn",sizeof(TestInt))); RETAILMSG(1,(L"size of struct(char,FourBytesEml(char,char,char,char)) is %drn",sizeof(TestIntEml))); // 对比 TestDouble 和 TestDoubleEml 占用内存空间的情况 RETAILMSG(1,(L"size of struct(char,double) is %drn",sizeof(TestDouble))); RETAILMSG(1,(L"size of struct(char,EightBytesEml(char,char,char,char,char,char,char,char)) is %drn", sizeof(TestDoubleEml))); #else printf("size of char is %drn",sizeof(char)); printf("size of short is %drn",sizeof(short)); printf("size of int is %drn",sizeof(int)); printf("size of long is %drn",sizeof(long)); printf("size of char * is %drn",sizeof(char *)); printf("size of float is %drn",sizeof(float)); printf("size of double is %drn",sizeof(double)); // 对比 TestOder, TestOrder3 和 TestOder2 占用内存空间的情况 printf("size of struct(char,char,int,char,char) is %drn",sizeof(TestOrder)); printf("size of struct(int,char,char,char,char) is %drn",sizeof(TestOrder2)); printf("size of struct(int,char,char,char) is %drn",sizeof(TestOrder3)); // 对比 TestShort 和 TestShortEml 占用内存空间的情况 printf("size of struct(char,short) is %drn",sizeof(TestShort)); printf("size of struct(char,TwoBytesEml(char,char)) is %drn",sizeof(TestShortEml)); // 对比 TestInt 和 TestIntEml 占用内存空间的情况 printf("size of struct(char,int) is %drn",sizeof(TestInt)); printf("size of struct(char,FourBytesEml(char,char,char,char)) is %drn",sizeof(TestIntEml)); // 对比 TestDouble 和 TestDoubleEml 占用内存空间的情况 printf("size of struct(char,double) is %drn",sizeof(TestDouble)); printf("size of struct(char,EightBytesEml(char,char,char,char,char,char,char,char)) is %drn", 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) = %dn", sizeof(struct TstStruct))); RETAILMSG(1,(L"size of (struct TstStruct2) = %dn", sizeof(struct TstStruct2))); RETAILMSG(1,(L"size of (struct TstStruct3) = %dn", sizeof(struct TstStruct3))); RETAILMSG(1,(L"size of (struct TstStruct4) = %dn", sizeof(struct TstStruct4))); RETAILMSG(1,(L"size of (struct TstStruct5) = %dn", sizeof(struct TstStruct5))); RETAILMSG(1,(L"size of (struct TstStruct6) = %dn", sizeof(struct TstStruct6))); RETAILMSG(1,(L"size of (struct TstStruct6_R) = %dn", sizeof(struct TstStruct6_R))); RETAILMSG(1,(L"size of (struct TstStruct7) = %dn", sizeof(struct TstStruct7))); RETAILMSG(1,(L"size of (struct TstStruct8) = %dn", sizeof(struct TstStruct8))); RETAILMSG(1,(L"size of (struct TstStruct9) = %dn", sizeof(struct TstStruct9))); #else printf("size of (struct TstStruct) = %dn", sizeof(struct TstStruct)); printf("size of (struct TstStruct2) = %dn", sizeof(struct TstStruct2)); printf("size of (struct TstStruct3) = %dn", sizeof(struct TstStruct3)); printf("size of (struct TstStruct4) = %dn", sizeof(struct TstStruct4)); printf("size of (struct TstStruct5) = %dn", sizeof(struct TstStruct5)); printf("size of (struct TstStruct6) = %dn", sizeof(struct TstStruct6)); printf("size of (struct TstStruct6_R) = %dn", sizeof(struct TstStruct6_R)); printf("size of (struct TstStruct7) = %dn", sizeof(struct TstStruct7)); printf("size of (struct TstStruct8) = %dn", sizeof(struct TstStruct8)); printf("size of (struct TstStruct9) = %dn", 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 */