packed record中 的 packed 用于限定 record 中数据的对齐方式。
我的问题是:
什么时候用 packed 的呢?我的意思是什么时候必须用!
(比如:“用到API时”之类的。这是我猜的,因为我看 Windows、ShellAPI 单元中用到 packed 的地方也是屈指可数,好象多数都没用。) 不要告诉我:packed节省空间,但慢。不用 packed 快。 问题的提出:我是调用NTDLL.DLL 中的 ZwQuerySystemInformation 时发现返回的Buf读不明白(指record数据中的record的成员)
我的问题是:
什么时候用 packed 的呢?我的意思是什么时候必须用!
(比如:“用到API时”之类的。这是我猜的,因为我看 Windows、ShellAPI 单元中用到 packed 的地方也是屈指可数,好象多数都没用。) 不要告诉我:packed节省空间,但慢。不用 packed 快。 问题的提出:我是调用NTDLL.DLL 中的 ZwQuerySystemInformation 时发现返回的Buf读不明白(指record数据中的record的成员)
解决方案 »
- delphi7 显示gif动画问题!---在线等
- delphi7 msxml,使用的是哪个版本的msxml*.dll?
- 请问怎么从数据库动态创建按钮事件代码?
- 我需要BusinessSkinForm得帮助文档和demo!
- 这是怎么啦
- 各位:好久没发贴子,首先祝大家新一天有新的收获,没事进来看一下...
- Delphi安装的序列号是多少?
- 请问dbchart错误帮忙,谢谢,急,马上给分
- 在光标点dbgrideh中的内容时,引发异常 exception :C0000006,哪位碰到过,怎样解决!谢谢
- 谁有用户自选择任意字段,用户自己组合多个条件查询的源程序?
- 各位帮个忙
- DbGrid的怪问题,非高手勿进,谢谢!
显示的结果应该为28,而不是18!按道理应该是22。用Packed的结果就是22。拟定义的数组比较大,应该用packed record!原因如下:在Windows中内存的分配一次是4个字节的。而Packed按字节进行内存的申请和分配,这样速度要慢一些,因为需要额外的时间来进行指针的定位。因此如果不用Packed的话,Delphi将按一次4个字节的方式申请内存,因此如果一个变量没有4个字节宽的话也要占4个字节!这样就浪费了。按上面的例子来说:var1:integer;//integer刚好4个字节!var2-var5占用4个字节,Var6-Var8占用4个字节,浪费了一个字节。var9:integer//占用4个字节;var10:占用4个字节;浪费3个字节var11:占用4个字节;var12,var13占用4个字节;浪费2个字节所以,如果不用packed的话,那么一共浪费6个字节!所以原来22个字节的记录需要28个字节的内存空间!这是因为在32位的环境中,所有变量分配的内存都进行“边界对齐”造成的。这样做可以对速度有优化作用;但是单个定义的变量至少会占用32位,即4个字节。所以会有长度误差,你可以用packed关键字取消这种优化。深入的分析,内存空间(不是内存地址)在计算机中划分为无数与总线宽度一致的单位,单位之间相接的地方称为“边界”;总线在对内存进行访问时,每次访问周期只能读写一个单位(32bit),如果一个变量横跨“边界”的话,则读或写这个变量就得用两个访问周期,而“边界对齐”时,只需一个访问周期,速度当然会有所优化。
不过我要问的是:………………
……我的意思是什么时候必须用!
………………
不要告诉我:packed节省空间,但慢。不用 packed 快。
………………