荔园在线

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

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


发信人: bakey (猪朋狗友), 信区: Program
标  题: [合集]C/C++中struct各成员空间分配 zz
发信站: 荔园晨风BBS站 (2006年01月09日18:58:11 星期一), 站内信件

☆   1  ──────────── 我是分割线 ─────────────────☆
发信人: kaman (天外飛仙), 信区: Program
标  题: C/C++中struct各成员空间分配 zz
时  间: 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)

就可以了~



☆   2  ──────────── 我是分割线 ─────────────────☆
发信人: bakey (猪朋狗友), 信区: Program
标  题: Re: C/C++中struct各成员空间分配 zz
时  间: 2005年12月14日19:18:36 星期三

今天竟然这么有兴致过来发这个?
【 在 kaman (天外飛仙) 的大作中提到: 】
: 看看这个
: struct  tagHDD
: {
: char  c1;
: DWORD  n;
: }HDD;
: long  n=sizeof(HDD);//n会返回8,为什么
: 在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间;各个成?
: 例如,下面的结构各成员空间分配情况。
: struct  test  {
: .................(以下省略)



☆   3  ──────────── 我是分割线 ─────────────────☆
发信人: kaman (天外飛仙), 信区: Program
标  题: Re: C/C++中struct各成员空间分配 zz
时  间: 2005年12月14日19:22:32 星期三


我被那个东西玩了一个下午了,郁闷。。。

gcc的那个什么自然对界什么好像是四,

怎样定义struct的结构最后sizeof一下都会是4的倍数。。。

【 在 bakey (猪朋狗友) 的大作中提到: 】
: 今天竟然这么有兴致过来发这个?
: 【 在 kaman (天外飛仙) 的大作中提到: 】
: : 看看这个
: : struct  tagHDD
: : {
: : char  c1;
: : DWORD  n;
: : }HDD;
: : long  n=sizeof(HDD);//n会返回8,为什么
: : 在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间;各个?
: .................(以下省略)



☆   4  ──────────── 我是分割线 ─────────────────☆
发信人: mmkiller (抱抱很温暖), 信区: Program
标  题: Re: C/C++中struct各成员空间分配 zz
时  间: 2005年12月14日19:29:41 星期三

 会不会和处理器有关系呢
 32bit对32bit, 64bit对64bit..

【 在 kaman (天外飛仙) 的大作中提到: 】
: 我被那个东西玩了一个下午了,郁闷。。。
: gcc的那个什么自然对界什么好像是四,
: 怎样定义struct的结构最后sizeof一下都会是4的倍数。。。
: 【 在 bakey (猪朋狗友) 的大作中提到: 】
: : 今天竟然这么有兴致过来发这个?
: : .................(以下省略)



☆   5  ──────────── 我是分割线 ─────────────────☆
发信人: kaman (天外飛仙), 信区: Program
标  题: Re: C/C++中struct各成员空间分配 zz
时  间: Wed Dec 14 19:44:05 2005

May be...

冇机比我试。。。哈哈~

【 在 mmkiller 的大作中提到: 】
:  会不会和处理器有关系呢
:  32bit对32bit, 64bit对64bit..
: 【 在 kaman (天外飛仙) 的大作中提到: 】
: : 我被那个东西玩了一个下午了,郁闷。。。
: : gcc的那个什么自然对界什么好像是四,
: : 怎样定义struct的结构最后sizeof一下都会是4的倍数。。。



☆   6  ──────────── 我是分割线 ─────────────────☆
发信人: mmkiller (抱抱很温暖), 信区: Program
标  题: Re: C/C++中struct各成员空间分配 zz
时  间: 2005年12月14日21:34:16 星期三


 应该是的吧~这样对齐有利于cpu处理数据

【 在 kaman (天外飛仙) 的大作中提到: 】
: May be...
:
: 冇机比我试。。。哈哈~
:
: 【 在 mmkiller 的大作中提到: 】
: :  会不会和处理器有关系呢
: :  32bit对32bit, 64bit对64bit..
: : 【 在 kaman (天外飛仙) 的大作中提到: 】



☆   7  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: C/C++中struct各成员空间分配 zz
时  间: 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)条件分配空间;各个成?
:
: 例如,下面的结构各成员空间分配情况。
:
: struct  test  {
: char  x1;
: short  x2;
: float  x3;
: char  x4;
: };
: 结构的第一个成员x1,其偏移地址为0,占据了第1个字节。第二个成员x2为short类型,?
员x
: 3要求4字节对界,是该结构所有成员中要求的最大对界单元,因而test结构的自然对界条
: 现在你知道怎么回事了吧?
: 更改C编译器的缺省分配策略
: 一般地,可以通过下面的方法改变缺省的对界条件:
: ?  使用伪指令#pragma  pack  ([n])
: #pragma  pack  ([n])伪指令允许你选择编译器为数据分配空间所采取的对界策略。
: 例如,在使用了#pragma  pack  (1)伪指令后,test结构各成员的空间分配情况就是按照
: #pragma  pack(push)  //保存对齐状态
: #pragma  pack(1)
: //定义你的结构
: //…………
: #pragma  pack(pop)
:
: ---------------------------------------------------------------
:
: 在编译选项中可以设置:菜单中“工程”-->“设置”,    弹出一个“project  settin
:
: 重新编译。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软件 网络书店