荔园在线

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

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


发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: C/C++中struct各成员空间分配 zz
发信站: 荔园晨风BBS站 (2005年12月15日20:46:23 星期四), 站内信件

自然对界应该是natural alignment,不是只是alignment。
自然对界是台湾式翻译,普通话应该翻译为"自然对齐"比较容易让人理解。

gcc里面可以用__alignof__来检查一个数据结构的对齐方式

例如
printf("%d", __alignof__(int));
输出:

4
【 在 kaman (天外飛仙) 的大作中提到: 】
: 标  题: 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]


--

      §
      █D

 Would you like to have a cup of hot tea with me?
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 218.17.192.209]


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

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