本帖最后由 chinestercn 于 2010-10-14 18:41:10 编辑

解决方案 »

  1.   

    结构体成员内存对齐导致的。先查看一下数据是否正确,如果不正确,那么试将结构体的定义改为:
    myrec=packed record
      d1:dword;
      b1:byte;
      d2:dword;
      end;
      

  2.   

    谢谢灰常谢谢。解决了。这个对齐。一直是一知半截。因为是自学DELPHI。一直搞不明白。type xx=packed record 

    type xx record
    有什么区别。只是听人说加 packed 是压缩数据的。请讲楼上的讲解一下吧。
      

  3.   

    myrec=record
      d1:dword;
      b1:byte;
      d2:dword;
      end;这里用sizeof(myrec)返回的是12,因为要内存对齐,所以b1会被当成4个字节,如果加packed sizeof(myrec)结果就是9,还有多种变换你可以试一下。
      

  4.   

    内存对齐是为了提高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就只需要从第三个机器字当中一次性读取