Delphi压缩对象-中断的向后兼容性
我正在将一个旧项目从Delphi7迁移到2007年,它似乎是打包对象Delphi压缩对象-中断的向后兼容性,delphi,Delphi,我正在将一个旧项目从Delphi7迁移到2007年,它似乎是打包对象 type TMyTime = packed object private Year: Word; Month: Byte; Day: Byte; Hour: Byte; Minute: Byte; Milliseconds: Word; end; 产生 [Pascal错误]*.pas(x):此处不允许使用E2006打包 D2007中的错误 有人能告诉我哪个Delph
type
TMyTime = packed object
private
Year: Word;
Month: Byte;
Day: Byte;
Hour: Byte;
Minute: Byte;
Milliseconds: Word;
end;
产生
[Pascal错误]*.pas(x):此处不允许使用E2006打包
D2007中的错误
有人能告诉我哪个Delphi版本破坏了打包对象的兼容性吗?从中我们可以看到该漏洞是在D2005中报告的,在XE2中修复的。从中我们可以看到该漏洞是在D2005中报告的,在XE2中修复的。您可以在此处使用
记录而不是对象:
type
TMyTime = packed record
Year: Word;
Month: Byte;
Day: Byte;
Hour: Byte;
Minute: Byte;
Milliseconds: Word;
end;
或者为对象
范围本身启用打包:
type
{$A-} // packed object
TMyTime = object
private
Year: Word;
Month: Byte;
Day: Byte;
Hour: Byte;
Minute: Byte;
Milliseconds: Word;
end;
{$A+} // default un-packed
后者的优点是可以在Delphi7和更新版本上编译
对于Delphi 2009及更高版本,尽量避免使用对象
。改为使用增强的记录
类型-但您会失去继承性…您可以在此处使用记录
而不是对象
:
type
TMyTime = packed record
Year: Word;
Month: Byte;
Day: Byte;
Hour: Byte;
Minute: Byte;
Milliseconds: Word;
end;
或者为对象
范围本身启用打包:
type
{$A-} // packed object
TMyTime = object
private
Year: Word;
Month: Byte;
Day: Byte;
Hour: Byte;
Minute: Byte;
Milliseconds: Word;
end;
{$A+} // default un-packed
后者的优点是可以在Delphi7和更新版本上编译
对于Delphi 2009及更高版本,尽量避免使用对象
。改用增强的记录
类型-但您会失去继承性…它也在XE2中编译。但2010年不是这样。这里没有XE。您应该使用此类型的记录。您也不应该打包它,因为这样会使性能更差。如果您必须打包,并且必须使用对象
,那么请使用{$ALIGN 1}
。它也在XE2中编译。但2010年不是这样。这里没有XE。您应该使用此类型的记录。您也不应该打包它,因为这样会使性能更差。如果您必须打包,并且必须使用对象
,那么请使用{$ALIGN 1}
。。。。而且在所有情况下,对象
都是不推荐使用的。如果可以的话,请远离它-即使,因为我们使用新的扩展记录
类型松开了继承…@ArnaudBouchez,实际上,我对对象模型从TP移植到Delphi感到惊讶。从来没有找到它的好用途。使用扩展的(从D2006?)可能性和助手声明,记录很好,而且更好。我可以在没有缺失继承的情况下生活。分配堆栈或数组的数据结构非常有效TObject
有开销,并且增加了内存碎片,这有时是不需要的。实际上,record
不支持继承,而我非常喜欢object
可以继承的方式。我没有提到TP7object
virtual方法,也没有提到它们的constructor
s,它们都是有缺陷的。只需使用带有字段、方法和继承的纯对象
。如果我们能让记录
继承另一个记录
!请参阅仅当您需要继承多态性时,继承(和虚拟方法)才有意义,并且只有当该类型用作引用类型(IOW不是基于堆栈的)时,继承多态性才有意义。通过聚合可以很容易地继承字段和方法以实现简单的重用。@RudyVelthuis我写的继承没有虚拟方法。我不同意你的观点。记录聚合是一个真正的PITA,容易出错且冗长。在某些上下文中,我使用堆栈分配的记录/对象的引用(指针),这很好。对于记录数组,引用也很有用:您使用动态数组作为连续数据的“私有堆”,适合一级缓存,并且易于处理,例如使用SSEx指令。这种数据结构的处理速度比单个对象快几个数量级。。。。而且在所有情况下,对象
都是不推荐使用的。如果可以的话,请远离它-即使,因为我们使用新的扩展记录
类型松开了继承…@ArnaudBouchez,实际上,我对对象模型从TP移植到Delphi感到惊讶。从来没有找到它的好用途。使用扩展的(从D2006?)可能性和助手声明,记录很好,而且更好。我可以在没有缺失继承的情况下生活。分配堆栈或数组的数据结构非常有效TObject
有开销,并且增加了内存碎片,这有时是不需要的。实际上,record
不支持继承,而我非常喜欢object
可以继承的方式。我没有提到TP7object
virtual方法,也没有提到它们的constructor
s,它们都是有缺陷的。只需使用带有字段、方法和继承的纯对象
。如果我们能让记录
继承另一个记录
!请参阅仅当您需要继承多态性时,继承(和虚拟方法)才有意义,并且只有当该类型用作引用类型(IOW不是基于堆栈的)时,继承多态性才有意义。通过聚合可以很容易地继承字段和方法以实现简单的重用。@RudyVelthuis我写的继承没有虚拟方法。我不同意你的观点。记录聚合是一个真正的PITA,容易出错且冗长。在某些上下文中,我使用堆栈分配的记录/对象的引用(指针),这很好。对于记录数组,引用也很有用:您使用动态数组作为连续数据的“私有堆”,适合一级缓存,并且易于处理,例如使用SSEx指令。这种数据结构的处理速度比单个对象快几个数量级。嗯,肯定前者和后者都可以在Delphi7和更高版本上编译?O。o@Deltics两者都与Delphi7或更高版本兼容,但如果需要向结构中添加方法,则前者不允许,而后者则允许。但由于较新的Delphi编译器在初始化包含托管类型的对象(如string
)时出现问题,我通常编写:tmysttructure={$ifndef UNICODE}对象{$else}记录{$