内存对齐方法

namewchwch 2010-10-26 08:33:53
struct ss
{
char a;//1
float b;//4
short c;//2
char d;//1
};


sizeof(ss)
大小是什么?
...全文
136 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cap77 2010-10-26
  • 打赏
  • 举报
回复

struct ss
{
char a;//放在0号位
float b;//放在4~7
short c;//放在8~9
char d;//放在10
};
大小为11,和最大的4对齐,补1就是12
sizeof(ss)=12:
这篇文章不错:http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx


guangmingdeshenju 2010-10-26
  • 打赏
  • 举报
回复
12
http://www.cppblog.com/snailcong/archive/2009/03/16/76705.html
每个类型起始地址必须是 本身大小 的倍数
float从4开始,short从2开始、
还有就是结构体 对齐
houjin_cn 2010-10-26
  • 打赏
  • 举报
回复
sizeof(ss)=12:

struct ss
{
char a;//1->4
float b;//4->8
short c;//2->10
char d;//1->12
};
浅行 2010-10-26
  • 打赏
  • 举报
回复
引用下:
1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

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

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐
thao119 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 guangmingdeshenju 的回复:]

12
http://www.cppblog.com/snailcong/archive/2009/03/16/76705.html
每个类型起始地址必须是 本身大小 的倍数
float从4开始,short从2开始、
还有就是结构体 对齐
[/Quote]

补充一点,一个结构体所占内存长度必须为 该结构体成员中 各成员中所占字节最大的值的整数倍。

struct s1{
float f;
char c;
double d;}
sizof(s1) = 16;

struct s2 {
float f;
double d;
char c;}
sizeof(s2) = 24;

当然有情况会跟编译器有关。

hblac 2010-10-26
  • 打赏
  • 举报
回复
具体值多少还是要看编译器了,一般编译器默认对齐吧,LZ可以加上#pragma pack(1)试试
lanhaibin 2010-10-26
  • 打赏
  • 举报
回复
sizeof(ss) = 12

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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