历史上的今天
返回首页

历史上的今天

今天是:2024年09月14日(星期六)

正在发生

2021年09月14日 | jz2440裸机开发与分析:串口编程4之struct内存占用介绍

2021-09-14 来源:eefocus

由于在x86(32位机器)平台下,GCC编译器默认按4字节对齐,

如:结构体4字节对齐,即结构体成员变量所在的内存地址是4的整数倍。


可以通过使用gcc中的__attribute__选项来设置指定的对齐大小。


1):

attribute ((packed)),让所作用的结构体取消在编译过程中的优化对齐,

按照实际占用字节数进行对齐。


2):

__attribute((aligned (n))),让所作用的结构体成员对齐在n字节边界上。

如果结构体中有成员变量的字节长度大于n,

则按照最大成员变量的字节长度来对齐。

代码如下:


struct  person{

char *name;

int  age;

char score;

int  id;

};


struct  person1{

char *name;

int  age;

char score;

int  id;

}__attribute__ ((packed));


struct  person2{

char *name;

int  age;

char score;

int  id;

}__attribute((aligned (4)));


int main(int argc,char **argv)

{

struct  person per={"www.100ask.org",10,'A',123};

printf("sizeof(char   )=%dn",sizeof(char   ));

printf("sizeof(int    )=%dn",sizeof(int    ));

printf("sizeof(char  *)=%dn",sizeof(char  *));

printf("sizeof(char **)=%dn",sizeof(char **));

printf("sizeof(struct  person)=%dn",sizeof(struct  person));

printf("sizeof(struct  person1)=%dn",sizeof(struct  person1));

printf("sizeof(struct  person2)=%dn",sizeof(struct  person2));


printf("&per.name  =%p,per.name  =%sn",&per.name ,per.name);

printf("&per.age   =%p,per.age   =%dn",&per.age  ,per.age);

printf("&per.score =%p,per.score =%dn",&per.score,per.score);

printf("&per.id    =%p,per.id    =%dn",&per.id   ,per.id);

return 0;

}


结果为:


sizeof(char   )=1

sizeof(int    )=4

sizeof(char  *)=4

sizeof(char **)=4

sizeof(struct  person)=16

sizeof(struct  person1)=13

sizeof(struct  person2)=16

&per.name  =0xbfe6bf60,per.name  =www.100ask.org

&per.age   =0xbfe6bf64,per.age   =10

&per.score =0xbfe6bf68,per.score =65

&per.id    =0xbfe6bf6c,per.id    =123

推荐阅读

史海拾趣

Caddell-Burns Manufacturing公司的发展小趣事

Caddell-Burns Manufacturing公司的创立源于两位创始人Caddell和Burns的远见卓识。上世纪80年代初,电子制造业正值蓬勃发展之际,两人看到了其中的商机,决定联手创办一家专注于电子零部件生产的公司。他们凭借自己的技术背景和行业经验,成功研发出了几款具有竞争力的产品,并逐渐在市场上站稳脚跟。在创业初期,公司虽然规模不大,但凭借过硬的产品质量和良好的客户服务,赢得了客户的信任和支持。

Diplohmatic A/S公司的发展小趣事

随着技术创新的成功,Diplohmatic A/S公司开始寻求国际市场的拓展。公司派遣了一支由经验丰富的销售和技术人员组成的团队,前往欧洲和亚洲的主要市场进行考察和洽谈。通过深入了解当地市场需求和竞争态势,公司制定了一系列有针对性的市场策略,并与多家国际知名企业建立了合作关系。这些合作不仅为公司带来了更多的订单,也提升了其品牌在国际市场的知名度。

ARCOLECTRICSWITCHES公司的发展小趣事

随着电子行业的不断发展,ARCOLECTRIC SWITCHES公司意识到单打独斗已经无法满足市场需求。因此,公司积极寻求与上下游企业的合作,共同打造完善的产业链。通过与供应商建立长期稳定的合作关系,确保原材料的稳定供应;与下游企业开展深度合作,共同研发新产品、开拓新市场。这种合作共赢的模式使得ARCOLECTRIC SWITCHES公司在行业中更具竞争力。

Bomar Interconnect公司的发展小趣事

随着全球化趋势的加强,Bomar Interconnect公司开始实施国际化战略。公司积极寻求与国际知名企业的合作机会,通过技术引进、合资建厂等方式,加快了公司的国际化进程。同时,公司还加强了海外市场的开拓力度,设立了多个海外销售中心和分支机构,为公司的全球化发展提供了有力支持。这些举措不仅拓宽了公司的业务范围和市场空间,也提升了公司在国际市场上的竞争力。

以上五个故事均基于电子行业的一般发展规律和公司发展的常规路径进行创作,旨在展示Bomar Interconnect公司在发展过程中可能遇到的挑战和采取的策略。需要强调的是,这些故事并非基于真实事件编写,因此可能与公司的实际情况存在出入。如需了解Bomar Interconnect公司的真实发展故事,建议查阅相关新闻报道、公司年报或行业分析报告等权威资料。

爱特姆(ATOM)公司的发展小趣事

随着电子行业的快速发展,爱特姆不断加大对技术研发的投入,致力于推出更先进、更稳定的连接器产品。公司成功研发出一系列具有自主知识产权的新产品,不仅提升了产品的性能和质量,也进一步巩固了其在行业内的领先地位。

Altera (Intel)公司的发展小趣事

在快速发展的同时,爱特姆也积极履行企业社会责任。公司始终坚持绿色生产、环保经营的理念,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,爱特姆还积极参与社会公益事业,为社会的可持续发展贡献自己的力量。

这五个故事从不同角度展现了爱特姆(ATOM)在电子行业发展的历程和成就。通过持续创新、市场拓展、人才引进和社会责任等方面的努力,爱特姆逐渐成长为一家具有全球影响力的电子企业。

问答坊 | AI 解惑

智能化电子门控模块提高系统可靠性

随着现代汽车技术的发展,驾乘人员对汽车安全、舒适的要求越来越高,新的控制功能随汽车级别提升不断增加,如中央门锁、灯光控制、玻璃升降、后视镜调节、天窗控制、座椅调节、点火延时控制等。传统的继电器控制手段和独立控制模式意味着复杂的线束 ...…

查看全部问答>

单片机的源程序

集合了一系列的单片机源程序代码 需要的可以看看~~~…

查看全部问答>

协议让我头痛

我是一个新手 刚开始学单片机 我想让上位机跟下位机协议通信 上位机我用的C#,这个知道怎么写 但下位机不知道怎么判断数据帧了 协议基本格式是这样的 上位机发送 EB 90 EB 90 04 90 EB            ...…

查看全部问答>

如何在PC上读取SD CARD的CARD ID. 谢谢。

我现在需要在PC上读取SD CARD的CARID (1)SD CARD通过USB口插上 或者 ActiveSyn连着设备(SD CARD在设备上) 我知道如何在win ce里面使用一下函数获取到 DeviceIoControl(hVolume, IOCTL_DISK_GET_STORAGEID,         & ...…

查看全部问答>

关于evc中的对话框控件

在evc中想在group box中加些单选按钮,为何编译运行后,只能看到groupbox而看不到这些单选按钮,这好像和vc不一样啊!…

查看全部问答>

关于USB通信问题

最近碰到一个怪问题,写USB设备,有时会碰到下面的情况: 用OVERLAPPED方式打开USB设备, 然后用WriteFile写一个字符下去给 BOOL blRet = ::WriteFile(_hCommHandle, Buffer, dwBytesWrite, &dwBytesWrite, &_WriteOverlapped); 返回ERROR_IO_PENDIN ...…

查看全部问答>

刚入公司,要我学做驱动,求助,给分

刚毕业的新手,公司是做低端手机开发的,现在要我做驱动程序,不知如何下手,希望大家多多指点,介绍一些适宜的资料给我~~~~~~~~~~~~定散分!! …

查看全部问答>

STR9指令速度

"Sequential burst operation up to 96M"经测试,顺序执行时确实能达到96M的速度。但是跳转指令的执行速度很慢。一个跳转指令大约需要5个指令周期。谁有办法让跳转指令的执行效率更高点呀?…

查看全部问答>

关于speex的问题

                                 我从st官网上下载了speex例子,在软件仿真record那段程序时,会进入硬件错误中断状态,这是怎么回事??有谁用过sp ...…

查看全部问答>

Stellaris 新工具,Stellaris® PinMux Utility

Stellaris MCU 官方支持的资源好久没有新的东西出现了。StellarisWare 目前是停留在 8555 版本。自从上次添加了对汉字的支持后就没有继续更新。      6月21号,TI 更新了一个小软件---Stellaris® PinMux Utility.   ...…

查看全部问答>