荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: kaman (天外飛仙), 信区: Program
标  题: C/C++中struct各成员空间分配 zz
发信站: 荔园晨风BBS站 (2005年12月14日19:03:35 星期三), 站内信件


看看这个

struct  tagHDD
{
char  c1;
DWORD  n;
}HDD;
long  n=sizeof(HDD);//n会返回8,为什么

在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间;各个成员
按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。在缺
省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。

例如,下面的结构各成员空间分配情况。

struct  test  {
char  x1;
short  x2;
float  x3;
char  x4;
};
结构的第一个成员x1,其偏移地址为0,占据了第1个字节。第二个成员x2为short类型,其
起始地址必须2字节对界,因此,编译器在x2和x1之间填充了一个空字节。结构的第三个成
员x3和第四个成员x4恰好落在其自然对界地址上,在它们前面不需要额外的填充字节。在
test结构中,成员x
3要求4字节对界,是该结构所有成员中要求的最大对界单元,因而test结构的自然对界条件
为4字节,编译器在成员x4后面填充了3个空字节。整个结构所占据空间为 12字节。
现在你知道怎么回事了吧?
更改C编译器的缺省分配策略
一般地,可以通过下面的方法改变缺省的对界条件:
?  使用伪指令#pragma  pack  ([n])
#pragma  pack  ([n])伪指令允许你选择编译器为数据分配空间所采取的对界策略。
例如,在使用了#pragma  pack  (1)伪指令后,test结构各成员的空间分配情况就是按照一
个字节对齐了,格式如下:
#pragma  pack(push)  //保存对齐状态
#pragma  pack(1)
//定义你的结构
//…………
#pragma  pack(pop)

---------------------------------------------------------------

在编译选项中可以设置:菜单中“工程”-->“设置”,    弹出一个“project  setting
”对话框。然后选择“C/C++”标签--->在“Y分类”中选择“Code  Generation”--->在“
Struct  member  alignment”中选择“1  Byte”。

重新编译。ok了!!
---------------------------------------------------------------

#pragma  pack(push,1)
typedef  struct  tagSocketData  {
   BYTE          nSize;
   BYTE          nType;
   DWORD        nDataSize;
   DWORD        nIndex;
   SOCKET      socket;
   DWORD        nDataLength;
}  SOCKETDATA,  *LPSOCKETDATA;
#progma  pack(pop,1)

就可以了~

--
如果爱可以四舍五入,
不妨拿一半当全部;
如果爱也算一种武术,
时间才是武林盟主...
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.14.119]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店