请教关于内存对齐的问题?

thecorr 2007-10-30 01:07:10
问题如下:
struct A
{
char a;
char b;
char b;
}

struct B
{
short a;
short b;
short c;
}

struct C
{
char a;
long b;
short c;
}

为什么sizeof(c)= 12;对齐
而 sizeof(A) = 3; sizeof(B) = 6;不需要对齐?

请问内存对齐的规则是什么?
...全文
93 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
thecorr 2007-10-30
  • 打赏
  • 举报
回复
不搞了 结贴
pptor 2007-10-30
  • 打赏
  • 举报
回复
请参考
http://yuanma.org/data/2006/0723/article_1213.htm
上面很清楚
thecorr 2007-10-30
  • 打赏
  • 举报
回复
还是不行啊~~
thecorr 2007-10-30
  • 打赏
  • 举报
回复
struct A
{
char a;
char b;
char b;
};
baihacker 2007-10-30
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
struct C
{
char a;
short c;
long b;
};
int main()
{
cout << sizeof(struct C) << endl;
return 0;
}
//结果就不同鸟,char(1), 空, short(2), long (4)
//有点递归的味道在里面
thecorr 2007-10-30
  • 打赏
  • 举报
回复
struct A
{
char a;
char b;
char b;
};

看看
jxlczjp77 2007-10-30
  • 打赏
  • 举报
回复
以这个结构来说明吧:
struct C
{
char a; //char占一个字节
long b; //long占四个字节
short c; //short占两个字节
};

a占一个字节,它按1字节对对齐,char是天然对齐的。
b占四个字节,它需要按4字节对齐,因此会在a后面补上3个空字节以满足自身的对齐要求。
c占两个字节,所以它会紧接在b后面,不需要再补齐空字节,因为b已经是四字节对齐的,后面肯定满足两字节对齐。
一共是 1(char) + 3(空) + 4(long) + 2(short) = 10字节
最后,struct整体还需要按照结构体中最大对齐粒度对齐,这里为long的4字节,所以10字节会再补2个空字节对齐到12字节。
为1(char) + 3(空) + 4(long) + 2(short) + 2(空) = 12字节。
visame 2007-10-30
  • 打赏
  • 举报
回复
请参考http://blog.csdn.net/my_ieee/archive/2007/10/29/1854111.aspx
讲得很清楚。
结论:struct 里面的元素是顺序存储的,每个元素占用的字节数根据对齐字节数N(struct 里占用字节最多的元素与CPU对齐字节数中较小的一个)进行调整.如果从左至右M个元素加起来的字节数大于N,则按从右至左舍去K个元素直至M-K个元素加起来的字节数小于等于N,如果等于N则不用字节填充,小于N则把M-K-1的元素填充直至=N.

别忘了给我加分哦!
baihacker 2007-10-30
  • 打赏
  • 举报
回复
点一下

点一下字体右边的那个工具就可以插入代码

struct A
{
char a;
char b;
char b;
};
//都是char,都是1字节的,所以向1对齐,大小为1 * 3 = 3
struct B
{
short a;
short b;
short c;
};
//都是short,都是2字节的,所以向2对齐,大小为2 * 3 = 6
struct C
{
char a;
long b;
short c;
};
//长度分别为1, 4 ,2 ,所以向4对齐,大小为4 * 3 = 12
//也可以加入预编译指令,强制向1对齐
#include <iostream>
using namespace std;
#pragma pack(push, 1)
struct C
{
char a;
long b;
short c;
};
#pragma pack(pop)
int main()
{
cout << sizeof(struct C) << endl;
return 0;
}
//结果为7
thecorr 2007-10-30
  • 打赏
  • 举报
回复
还有 大家告诉我怎么插入代码啊~~
我怎么用上面的插入代码不好使
没有颜色

64,636

社区成员

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

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