Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi压缩对象-中断的向后兼容性_Delphi - Fatal编程技术网

Delphi压缩对象-中断的向后兼容性

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

我正在将一个旧项目从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中的错误


有人能告诉我哪个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
可以继承的方式。我没有提到TP7
object
virtual方法,也没有提到它们的
constructor
s,它们都是有缺陷的。只需使用带有字段、方法和继承的纯
对象
。如果我们能让
记录
继承另一个
记录
!请参阅仅当您需要继承多态性时,继承(和虚拟方法)才有意义,并且只有当该类型用作引用类型(IOW不是基于堆栈的)时,继承多态性才有意义。通过聚合可以很容易地继承字段和方法以实现简单的重用。@RudyVelthuis我写的继承没有虚拟方法。我不同意你的观点。记录聚合是一个真正的PITA,容易出错且冗长。在某些上下文中,我使用堆栈分配的记录/对象的引用(指针),这很好。对于记录数组,引用也很有用:您使用动态数组作为连续数据的“私有堆”,适合一级缓存,并且易于处理,例如使用SSEx指令。这种数据结构的处理速度比单个对象快几个数量级。。。。而且在所有情况下,
对象
都是不推荐使用的。如果可以的话,请远离它-即使,因为我们使用新的扩展
记录
类型松开了继承…@ArnaudBouchez,实际上,我对对象模型从TP移植到Delphi感到惊讶。从来没有找到它的好用途。使用扩展的(从D2006?)可能性和助手声明,记录很好,而且更好。我可以在没有缺失继承的情况下生活。分配堆栈或数组的数据结构非常有效
TObject
有开销,并且增加了内存碎片,这有时是不需要的。实际上,
record
不支持继承,而我非常喜欢
object
可以继承的方式。我没有提到TP7
object
virtual方法,也没有提到它们的
constructor
s,它们都是有缺陷的。只需使用带有字段、方法和继承的纯
对象
。如果我们能让
记录
继承另一个
记录
!请参阅仅当您需要继承多态性时,继承(和虚拟方法)才有意义,并且只有当该类型用作引用类型(IOW不是基于堆栈的)时,继承多态性才有意义。通过聚合可以很容易地继承字段和方法以实现简单的重用。@RudyVelthuis我写的继承没有虚拟方法。我不同意你的观点。记录聚合是一个真正的PITA,容易出错且冗长。在某些上下文中,我使用堆栈分配的记录/对象的引用(指针),这很好。对于记录数组,引用也很有用:您使用动态数组作为连续数据的“私有堆”,适合一级缓存,并且易于处理,例如使用SSEx指令。这种数据结构的处理速度比单个对象快几个数量级。嗯,肯定前者和后者都可以在Delphi7和更高版本上编译?O。o@Deltics两者都与Delphi7或更高版本兼容,但如果需要向结构中添加方法,则前者不允许,而后者则允许。但由于较新的Delphi编译器在初始化包含托管类型的对象(如
string
)时出现问题,我通常编写:
tmysttructure={$ifndef UNICODE}对象{$else}记录{$