谁能详细说下内存对齐

futuretwo 2010-11-30 05:50:15
struct foo
{
char c1;
short s;
char c2;
int i;
};为什么sizeof(foo)是12,哪位大牛能详细说下内存对齐,谢谢,
...全文
154 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
liutengfeigo 2010-12-01
  • 打赏
  • 举报
回复
都知道有内存对齐这回事了,靠自己查资料然后动手得到知识会比较稳妥点吧。
sugar65 2010-12-01
  • 打赏
  • 举报
回复

#include <windows.h>
#include <stdio.h>

int main()
{
BITMAPFILEHEADER bmfh;
int a = sizeof (BITMAPFILEHEADER);
int b = sizeof (bmfh.bfSize);
printf ("%d\n", a);
printf ("%d\n", b);
return 0;
}


为什么BITMAPFILEHEADER里面有个bfSize成员大小是4字节,而BITMAPFILEHEADER大小确是14呢,这对不齐啊
hdusunny44 2010-12-01
  • 打赏
  • 举报
回复
不是不能,而是遵循内存对齐会使程序效率提高。
[Quote=引用 8 楼 bravery36 的回复:]
引用 3 楼 qq120848369 的回复:
C/C++ code

规则就是每个元素自身对齐+结构体整体对齐,具体请看http://wenku.baidu.com/view/fef2b769a45177232f60a2df.html

struct foo
{
char c1; //0
//1
short s;//2 3
char c2;//4
//5 6 7
int ……
[/Quote]
RLib 2010-12-01
  • 打赏
  • 举报
回复
花熊 2010-12-01
  • 打赏
  • 举报
回复
struct foo
{
char c1;
short s;
char c2;
int i;
};
a0 x |a2 x |a4 x x x| a8 x x x 规则见一楼
giant1st 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yiruirui0507 的回复:]
http://blog.csdn.net/yiruirui0507/archive/2010/07/06/5715734.aspx
看了你必懂!
[/Quote]

摘自楼上的例子,看看这个就够了:

typedef struct ms3
{
char a;
short b;
double c;
} MS3;
我想你一定能得出如下正确的布局图:

padding
|
_____v_________________________________
| |\| |\\\\\\\\\| |
| a |\| b |\padding\| c |
| |\| |\\\\\\\\\| |
+-------------------------------------+
Bytes: 1 1 2 4 8

sizeof(short)等于2,b字段应从偶数地址开始,所以a的后面填充一个字节,而sizeof(double)等于8,c字段要从8倍数地址开始,前面的a、b字段加上填充字节已经有4 bytes,所以b后面再填充4个字节就可以保证c字段的对齐要求了。
yiruirui0507 2010-11-30
  • 打赏
  • 举报
回复
http://blog.csdn.net/yiruirui0507/archive/2010/07/06/5715734.aspx
看了你必懂!
bravery36 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qq120848369 的回复:]
C/C++ code

规则就是每个元素自身对齐+结构体整体对齐,具体请看http://wenku.baidu.com/view/fef2b769a45177232f60a2df.html

struct foo
{
char c1; //0
//1
short s;//2 3
char c2;//4
//5 6 7
int i; //8 9 10 11
//整体长度0..……
[/Quote]
看了下内存数据分布,确实如您所说。结构体是最大类型的整数倍这个我知道,自身对齐是指?请大侠指教。
为何编译器不将前三个变量合成一个int大小呢?是因为short不能在奇数的地址开始写吗?
libinfei8848 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 flower_fancy 的回复:]
1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的……
[/Quote]

++++
bravery36 2010-11-30
  • 打赏
  • 举报
回复
菜鸟路过,我还以为是8呢,前面3个数不是正好4个字节吗?
qq120848369 2010-11-30
  • 打赏
  • 举报
回复

规则就是每个元素自身对齐+结构体整体对齐,具体请看http://wenku.baidu.com/view/fef2b769a45177232f60a2df.html

struct foo
{
char c1; //0
//1
short s;//2 3
char c2;//4
//5 6 7
int i; //8 9 10 11
//整体长度0..11=12,为min{sizeof(int),4}的整数倍,所以结构体已经对齐
}
無_1024 2010-11-30
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<stdlib.h>

struct foo
{
char c1;
short s;
char c2;
int i;
};

int main()
{
struct foo bb;
printf("%p\n",&bb.c1);
printf("%p\n",&bb.s);
printf("%p\n",&bb.c2);
printf("%p\n",&bb.i);
printf("%d\n",sizeof(foo));
return 0;
}

看看这个程序 和
http://www.360doc.com/content/10/0925/21/1317564_56365583.shtml
就会发现这个他的内存地址分布
c1c1c1c1 0000 ssss ssss
c2c2c2c2 0000 0000 0000
iiii iiii iiii iiii
flower_fancy 2010-11-30
  • 打赏
  • 举报
回复
1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.
truct foo
{
char c1; 占一个字节[0]
short s; 占两个字节[2] [3] 原则1
char c2; 占一个字节[4] 原则1
int i; 占四个字节[8][9][10][11]
};
所以sizeof(foo)的大小为12

64,682

社区成员

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

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