一只牛的异想世界
sizeof:对齐问题
因为对齐问题使结构体的
sizeof
变得比较复杂,看下面的例子:
(
默认对齐方式下
)
struct s1
{
char a;
double b;
int c;
char d;
};
struct s2
{
char a;
char b;
int c;
double d;
};
cout<<sizeof(s1)<<endl; // 24
cout<<sizeof(s2)<<endl; // 16
同样是两个
char
类型,一个
int
类型,一个
double
类型,但是因为对界问题,导致他们的大小不同。计算结构体大小可以采用元素摆放法,我举例子说明一下:首先,
CPU
判断结构体的对界,根据上一节的结论,
s1
和
s2
的对界都取最大的元素类型,也就是
double
类型的对界
8
。然后开始摆放每个元素。
对于
s1
,首先把
a
放到
8
的对界,假定是
0
,此时下一个空闲的地址是
1
,但是下一个元素
d
是
double
类型,要放到
8
的对界上,离
1
最接近的地址是
8
了,所以
d
被放在了
8
,此时下一个空闲地址变成了
16
,下一个元素
c
的对界是
4
,
16
可以满足,所以
c
放在了
16
,此时下一个空闲地址变成了
20
,下一个元素
d
需要对界
1
,也正好落在对界上,所以
d
放在了
20
,结构体在地址
21
处结束。由于
s1
的大小需要是
8
的倍数,所以
21-23
的空间被保留,
s1
的大小变成了
24
。
对于
s2
,首先把
a
放到
8
的对界,假定是
0
,此时下一个空闲地址是
1
,下一个元素的对界也是
1
,所以
b
摆放在
1
,下一个空闲地址变成了
2
;下一个元素
c
的对界是
4
,所以取离
2
最近的地址
4
摆放
c
,下一个空闲地址变成了
8
,下一个元素
d
的对界是
8
,所以
d
摆放在
8
,所有元素摆放完毕,结构体在
15
处结束,占用总空间为
16
,正好是
8
的倍数。
这里有个陷阱,对于结构体中的结构体成员,不要认为它的对齐方式就是他的大小,看下面的例子:
struct s1
{
char a[8];
};
struct s2
{
double d;
};
struct s3
{
s1 s;
char a;
};
struct s4
{
s2 s;
char a;
};
cout<<sizeof(s1)<<endl; // 8
cout<<sizeof(s2)<<endl; // 8
cout<<sizeof(s3)<<endl; // 9
cout<<sizeof(s4)<<endl; // 16;
s1
和
s2
大小虽然都是
8
,但是
s1
的对齐方式是
1
,
s2
是
8
(
double
),所以在
s3
和
s4
中才有这样的差异。
所以,在自己定义结构体的时候,如果空间紧张的话,最好考虑对齐因素来排列结构体里的元素。
posted on 2009-05-16 18:11
蒋耘
阅读(656)
评论(0)
编辑
收藏
所属分类:
C/C++
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
sizeof:对齐问题
关于VC2008下提示找不到MSVCP90D.dll的解决办法
C++虚函数表解析(转)
Powered by:
BlogJava
Copyright © 蒋耘
<
2009年5月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
导航
BlogJava
首页
新随笔
联系
聚合
管理
统计
随笔 - 12
文章 - 0
评论 - 37
引用 - 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
C/C++(3)
(rss)
J2EE(1)
(rss)
Linux/Unix(2)
(rss)
数据库(2)
(rss)
数据结构与算法(2)
(rss)
求职
(rss)
网络(2)
(rss)
随笔档案
2009年5月 (11)
2009年4月 (1)
搜索
最新评论
1. re: 一个找出素数的程序
ss
--q
2. re: 单向链表反转(转)[未登录]
方法一中尾节点(翻转前的头结点)Next未置为NULL
--fornever
3. re: 关于SQL 数据库表中的聚集SC
ss
--V
4. re: 同步/异步与阻塞/非阻塞的区别(转)
讲得不错 心有领悟
--ywc
5. re: 同步/异步与阻塞/非阻塞的区别(转)
太经典了,顶一下!
--galen
阅读排行榜
1. TCP/IP协议头部结构体(转)(6987)
2. 同步/异步与阻塞/非阻塞的区别(转)(6261)
3. 单向链表反转(转)(3817)
4. 关于SQL 数据库表中的聚集索引和非聚集索引等(转)(1752)
5. 关于VC2008下提示找不到MSVCP90D.dll的解决办法(1085)
评论排行榜
1. 同步/异步与阻塞/非阻塞的区别(转)(2)
2. 一个找出素数的程序(1)
3. 单向链表反转(转)(1)
4. 关于SQL 数据库表中的聚集索引和非聚集索引等(转)(1)
5. 数据库的索引(0)