当前位置:首页 > 芯闻号 > 充电吧
[导读]年前辞职了,准备年后找工作。所以在网上查找一下 C/C++ 基础方面的面试题,个人感觉这方面还是要准备一下。虽然后面的应聘没有用到所准备的这些,算是学习一下。在学习过程中,注意到一些关于结构体占用内存

年前辞职了,准备年后找工作。
所以在网上查找一下 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
*/



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭