荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店