在查看旧版 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/