指针和记录 使用的问题 本帖最后由 chinestercn 于 2010-10-14 18:41:10 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 结构体成员内存对齐导致的。先查看一下数据是否正确,如果不正确,那么试将结构体的定义改为:myrec=packed record d1:dword; b1:byte; d2:dword; end; 谢谢灰常谢谢。解决了。这个对齐。一直是一知半截。因为是自学DELPHI。一直搞不明白。type xx=packed record 和type xx record有什么区别。只是听人说加 packed 是压缩数据的。请讲楼上的讲解一下吧。 myrec=record d1:dword; b1:byte; d2:dword; end;这里用sizeof(myrec)返回的是12,因为要内存对齐,所以b1会被当成4个字节,如果加packed sizeof(myrec)结果就是9,还有多种变换你可以试一下。 内存对齐是为了提高CPU处理数据时,从用户内存到CPU使用时的效率,简单地说CPU访问用户内存,通常需要通过CPU的高速缓存,CPU与高速缓存之间交换数据是按机器字长处理的,比如说这个结构体:myrec=packed record d1:dword; b1:byte; d2:dword; end;在内存当中的数据表现为:|00|01|02|03| <--d1|10| <--b1 |11|12|13| <--d2|20| <--d2如果CPU要读取D2,必须做两次内存交换,才可以得到,即从第二个机器字内容当中取得前三个字节,再从第三个机器字内容当中取得第四个字节,如此将大大降低数据的处理效率但是如果变成:myrec=record d1:dword; b1:byte; d2:dword; end;其内存表现为:|00|01|02|03| <--d1|10| <--b1 |11|12|13| <--内存空隙 (所谓的压缩就是把后面数据往前移占用掉这部分空隙)|20|21|22|23| <--d2具时取d2就只需要从第三个机器字当中一次性读取 windows2000 系统下程序不能删除的问题! 已解决问题求一个分析,关于查询及取特定字段值的 怎么获取上一次登录的用户信息? 求一简单算法! 添加数据速度问题? 请问如何把treeview控件的root节点改为一个图标? 我要在Delphi中添加TRaveDataText组件,请问要添加那个单元? navigator出问题了。帮帮我吧! 问一个问题,先来的先给分!!!很简单。。。。。快来拿分啊 看了两本Delphi教材了,但发现Pascal语言没有变量转换函数,也没有操作符和表达式的概念,真是不明白 程序界面怎么弄得好看呢 idftp如何下载整个目录
myrec=packed record
d1:dword;
b1:byte;
d2:dword;
end;
和
type xx record
有什么区别。只是听人说加 packed 是压缩数据的。请讲楼上的讲解一下吧。
d1:dword;
b1:byte;
d2:dword;
end;这里用sizeof(myrec)返回的是12,因为要内存对齐,所以b1会被当成4个字节,如果加packed sizeof(myrec)结果就是9,还有多种变换你可以试一下。
myrec=packed record
d1:dword;
b1:byte;
d2:dword;
end;
在内存当中的数据表现为:
|00|01|02|03| <--d1
|10| <--b1
|11|12|13| <--d2
|20| <--d2
如果CPU要读取D2,必须做两次内存交换,才可以得到,即从第二个机器字内容当中取得前三个字节,再从第三个机器字内容当中取得第四个字节,如此将大大降低数据的处理效率但是如果变成:
myrec=record
d1:dword;
b1:byte;
d2:dword;
end;
其内存表现为:
|00|01|02|03| <--d1
|10| <--b1
|11|12|13| <--内存空隙 (所谓的压缩就是把后面数据往前移占用掉这部分空隙)
|20|21|22|23| <--d2
具时取d2就只需要从第三个机器字当中一次性读取