历史上的今天
今天是: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
史海拾趣
|
随着现代汽车技术的发展,驾乘人员对汽车安全、舒适的要求越来越高,新的控制功能随汽车级别提升不断增加,如中央门锁、灯光控制、玻璃升降、后视镜调节、天窗控制、座椅调节、点火延时控制等。传统的继电器控制手段和独立控制模式意味着复杂的线束 ...… 查看全部问答> |
|
我现在需要在PC上读取SD CARD的CARID (1)SD CARD通过USB口插上 或者 ActiveSyn连着设备(SD CARD在设备上) 我知道如何在win ce里面使用一下函数获取到 DeviceIoControl(hVolume, IOCTL_DISK_GET_STORAGEID, & ...… 查看全部问答> |
|
刚毕业的新手,公司是做低端手机开发的,现在要我做驱动程序,不知如何下手,希望大家多多指点,介绍一些适宜的资料给我~~~~~~~~~~~~定散分!! … 查看全部问答> |
|
Stellaris 新工具,Stellaris® PinMux Utility Stellaris MCU 官方支持的资源好久没有新的东西出现了。StellarisWare 目前是停留在 8555 版本。自从上次添加了对汉字的支持后就没有继续更新。 6月21号,TI 更新了一个小软件---Stellaris® PinMux Utility. ...… 查看全部问答> |




