传说中一篇凑数的博客,无意中发现自己在08年3月写的一个东西,感觉挺有意思。就拿来凑凑数吧。不多说了,言归正传。
struct
stru_type
{
int a;
double d;
char * pch;
stru_type * stru;
};
sizeof (stru_type) =?
{
int a;
double d;
char * pch;
stru_type * stru;
};
sizeof (stru_type) =?
看到题目后思路是这样:
sizeof
(stru_type)
=
sizeof (a) + sizeof (d) + sizeof (pch) + sizeof (stru) = 4 + 8 + 4 + 4 = 20
sizeof (a) + sizeof (d) + sizeof (pch) + sizeof (stru) = 4 + 8 + 4 + 4 = 20
运行发现这个怎么都不正确,答案是24
找了些文档看了看,发现有一个内存的对齐的问题。基本思路如下:
结构体中任何一个元素的起始位置必须是该元素的字节数大小的倍数
回到原来的题目:
int a占四个字节起始位置为0符合sizeof(int)的倍数,
double d八个字节,但是起始位置为4,不符合sizeof(double)的倍数,则在int a之后4个字节开始排列。
同理,char*pch和stru_type*stru可以依次排列
最后要保证结构体的总大小是其中最大元素的倍数。
则题目结果为4+4+8+4+4=24。
扩展一下,C++的位域问题,
struct
s
{
int i: 8 ;
int j: 8 ;
int a: 9 ;
int b: 8 ;
};
cout < < sizeof (s) < < endl;
{
int i: 8 ;
int j: 8 ;
int a: 9 ;
int b: 8 ;
};
cout < < sizeof (s) < < endl;
这个程序的输出结果是8。首先看int i:8;这句的意思一个整形变量,占8bit。同理知道其他元素所占的位数,如果没有内存对齐的问题这个程序的结果应该是5,采用内存对齐的方式,8+9+8+8>32超过了4个字节,则新分配sizeof(int)个字节。结果为8。
以上结果均在win32平台下运行过。IDE是vs2005