请问这个结构体有几个字节?

嘿-嘿-嘿 2008-12-08 05:03:08
struct test
{
int a;
char b;
char arr[10];
}

我定义了这样一个结构体,我认为是15个字节,int4个,char1个,char数组10个,一共15个

但是为何sizeof是16个?
如果定义一个test类型的数组,test m[3] = { {1,'a',"jack"} , {2,'b',"tom"}, {3,'c',"marry"} };

反汇编后,每个元素最后会跟一个CC,如果算上它,的确是16个字节,到底是怎么算?

哪位指点一下,谢谢
...全文
115 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xtting_8984313 2008-12-08
  • 打赏
  • 举报
回复
例如如果你要建立一个数组,
struct test ttt[10];
如果要按照你的15,除了test[0]以外,其他变量就都不能对齐了。
lc19890326 2008-12-08
  • 打赏
  • 举报
回复
又是内存对齐的问题 解释最后一次啦

每个编译器都有默认的对齐系数 一般来说为4,程序员可以人为的通过#pragma pack(n)该设定n为对齐系数
内存对齐分为两个方面
1.结构体内数据成员的对齐
对齐规则为:第一个成员放在offset为0的位置,后面的成员依次增长,对齐系数为n和sizeof(成员类型)较小的那个,之后成员的起始位置要增长到第一个可以除尽对齐系数的地方(也就是下面说的圆整)
假设此时对齐系数为4
struct test
{
int a;//sizeof(int)==4,按4对齐,起始位置=0%4=0,存放区间[0,3]
char b;//sizeof(char)=1<4,按1对齐,起始位置4%1=0,存放区间[4]
char arr[10];//sizeof(char)=1<4,按1对齐,起始位置5%4==0,存放位置[5,14]
}
此时你可以看到,这个结构体大小确实函数15,为什么测试是16呢,还有下面的整体对齐

2.结构体本身的对齐
对齐规则:对齐系数为#pragma pack(n)中的n和结构(或联合)最大数据成员长度中比较小的那个。
即整体对齐系数对齐系数=min(max(int,char,char),4)=4;
而整体大小=成员总大小按整体对齐系数圆整。m按n圆整的意思就是m不断加1,直到能整除n的那个m值。
这里15按4圆整当然就是16啦。
所以sizeof(test)=16;


嘿-嘿-嘿 2008-12-08
  • 打赏
  • 举报
回复
发贴完毕后,我也自己去找答案了,也搞明白了,不过还是谢谢2位热心人
马上结贴给分
sagegz 2008-12-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 erwin1984 的回复:]
32位编译器默认4字节对齐,所以大小为4的倍数16.
[/Quote]
正解!如果LZ还不太清楚的话,建议去看32位汇编.
erwin1984 2008-12-08
  • 打赏
  • 举报
回复
32位编译器默认4字节对齐,所以大小为4的倍数16.
hhyttppd 2008-12-08
  • 打赏
  • 举报
回复
内存对齐,一般会将地址(比如字段首址)对齐到4字节的边界处 。
你可能强制按指定方式对齐。
#pragma push(pack, 1)

...
#pragma pop(pack)
内容概要:本文围绕不确定环境下的多式联运路径优化问题展开研究,提出并实现了基于AFO算法、遗传算法(GA)和粒子群优化算法(PSO)的三种智能优化方法,并借助Matlab平台完成算法编程与仿真。研究构建了考虑时间、成本、转运风险等多重不确定因素的路径优化模型,系统比较了AFO、GA、PSO三种算法在收敛速度、全局寻优能力和稳定性方面的表现,同时引入Matlab自带的全局优化搜索器作为基准对照,深入分析各算法在复杂物流网络中的适用边界与性能差异。研究表明,AFO算法在解决此类组合优化问题时展现出更快的收敛效率和更强的局部规避能力。; 适合人群:具备一定Matlab编程基础与运筹优化知识,从事物流工程、交通运输规划、智能算法开发等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多式联运、综合货运网络中的路径决策支持系统构建;②为不确定性条件下复杂路径规划问题提供智能算法选型依据与技术实现方案;③支持科研人员复现主流优化算法并开展横向性能对比实验,推动算法改进与实际落地。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析算法实现流程,重点理解目标函数设计、约束条件处理及参数敏感性分析部分,可通过调整问题规模与算法参数进行对比实验,进一步拓展至动态路径规划或大规模网络优化等延伸场景。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧