delphi - 除了 "packed"记录之外什么都没有——我应该修复它吗?

标签 delphi delphi-7 record packed

在查看旧版 Delphi 7 程序中的一些代码时,我注意到到处都有一条记录,它被标记为 packed。这当然意味着记录是逐字节存储的,并且没有对齐以加快 CPU 访问速度。打包似乎是盲目完成的,目的是为了智取编译器或其他东西——基本上是评估几个字节的内存而不是更快的访问

示例记录:

TFooTypeRec = packed record
    RID                 : Integer;
    Description         : String;
    CalcInTotalIncome   : Boolean;
    RequireAddress      : Boolean;
end;

我应该解决这个问题并使每条记录正常或“不”打包吗?或者对于现代 CPU 和内存来说,这可以忽略不计并且可能浪费时间?拆包时是否会出现任何问题?

最佳答案

如果不完全了解每个打包记录在应用程序代码中的使用方式,就无法回答这个问题。这与问“我应该将此变量声明从 Int64 更改为 Byte 吗?”相同。

如果不知道该变量需要什么值来维持,答案可能是肯定的。或者也可能不是。

你的情况也类似。如果一条记录需要被打包,那么它应该被打包。如果不需要包装,那么不包装也没有什么坏处。如果您不确定或无法判断,那么最安全的做法就是让它们保持原样。

作为做出此决定的指南(如果您决定继续),需要或建议打包记录的情况包括:

  • 记录值的持久性
  • 与[可能]不同编译的代码共享记录值
  • 与外部定义的结构严格兼容
  • 故意将类型布局覆盖在不同结构的内存上

这不一定是详尽的列表,这些列表的共同点是:

  • 由一系列相邻字节值组成的记录,该记录的任何潜在生产者或消费者必须并且可以依赖这些值,而不会受到编译器或其他因素的干扰

我建议您(如果可能且可行)确定每种情况下包装的用途,并将相关文件添加到记录声明本身中,以便将来遇到相同问题的任何人都不必这样做经历这个发现过程,例如:

  type
    TSomeRecordType = packed record
      // This record must be packed as it is used for persistence
      ..
    end;

    TSomeExternType = packed record
      // This record must be packed as it is required to be compatible
      //  in memory with an externally defined struct (ref: extern code docs)
      ..
    end;

关于delphi - 除了 "packed"记录之外什么都没有——我应该修复它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7733140/

相关文章:

delphi - Delphi中的数据库用户名和密码?

ruby - Ruby 中是否有类似于 Pascal 记录的数据结构?

iphone - 将电压施加到 iPhone 的麦克风端口

delphi - TButton.Caption 中的特殊 unicode 字符(而不是图标)

delphi - 自动将单元添加到项目中

delphi - 如何在运行时分配 MDIChild 的 OnClose 事件?

.net - 代表出生日期

c++ - 使 ShowHint 在具有多个不同 Rect 的自定义控件上工作,每个 Rect 都有自己的 Hint

delphi - 找不到WinDows.PATH

delphi - Delphi XE4 中有 TMap 类吗?