游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2140|回复: 7

一个VC6.0的问题

[复制链接]

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2006-1-25 18:05:00 | 显示全部楼层 |阅读模式
我很多次遇到过这种情况:

假设有一个结构体
struct STRUCT
{
    BYTE    a;
    DWORD b;
    WORD   c;
    BYTE    d;
} obj;

然后
obj.a = 10;
obj.b = 10234;
obj.c = 234;
obj.d = 128;

再用CFile类对象保存到硬盘上的一个文件中
pf.Write( &obj, sizeof(STRUCT) );

查看文件的内容,结果是这个样子的:
0A CD CD CD FA 27 00 00 EA 00 80 CD

将a改成WORD,结果入下:
0A 00 CD CD FA 27 00 00 EA 00 80 CD

都不是预期的结果
0A FA 27 00 00 EA 00 80 和 0A 00 FA 27 00 00 EA 00 80

同样的,如果文件中保存了如下内容
0A FA 27 00 00 EA 00 80

用pf.Read( &obj, sizeof(STRUCT) );来读取同样得不到正确的结果。

难道strcut在内存中不管第一个成员是什么类型的,都是以4位对齐来存储的?

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-1-25 19:13:00 | 显示全部楼层

Re:一个VC6.0的问题

是不是因为 vc 是需要上面的数据总大小必须是下一个类型的倍数

20

主题

100

帖子

112

积分

注册会员

Rank: 2

积分
112
发表于 2006-1-25 19:56:00 | 显示全部楼层

Re:一个VC6.0的问题

VC 6默认双字对齐,需要调整的话参考#pragma pack等指令

7

主题

67

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2006-1-25 20:01:00 | 显示全部楼层

Re:一个VC6.0的问题

内存对齐的原因,默认是以8字节对齐的,即64位变量,结构中没有8字节的,以4字节对齐。
struct TEST
{
DWORD A;
BYTE b;
}
sizeof(TEST) 的结果=8,因为是以DWORD的大小对齐的。

如果需要按单字节对齐,可以在struct前面加#pragma pack(1)
struct 声明结束再改回来 #pragma pack(8)

#pragma pack(1)
struct TEST
{
DWORD A;
BYTE b;
}
#pragma pack(8)

sizeof(TEST) = 5

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
 楼主| 发表于 2006-1-25 20:52:00 | 显示全部楼层

Re:一个VC6.0的问题

哦~~原来是这个样子的,非常感谢各位大虾~~

13

主题

978

帖子

978

积分

高级会员

Rank: 4

积分
978
发表于 2006-1-25 21:15:00 | 显示全部楼层

Re:一个VC6.0的问题

恩恩……内存对齐是一个非常重要的优化,这也是16位编译器效率不如32位编译器的原因之一

经验Jur-25-2059号:不要刻意使用byte,因为内存对齐这个重要的优化使得byte的大小和int一样。

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-1-27 14:13:00 | 显示全部楼层

Re:一个VC6.0的问题

楼上厉害!
“经验Jur-25-2059号”
——连经验也有编号!

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2006-1-27 20:52:00 | 显示全部楼层

Re:一个VC6.0的问题

6楼最好把自己的经验库归公,呵呵
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 08:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表