TStream.Position与TStream.Seek相比

Lut*_*hfi 7 delphi

要在TStream类中移动"当前字节"指针,我们可以使用属性Position(例如MyStream.Position:= 0)或使用Seek方法(例如MyStream.Seek(0,soFromBeginning).问题是,哪一个更有效(又快点??(我没有源,所以我自己无法检查).

到目前为止,我总是使用Seek定位指针.

Uwe*_*abe 10

TStream.Seek处理32位或64位值的重载函数一样,它取决于当前流实现,这可能是更好的选择.

例如,TCustomMemoryStream 实现32位版本Seek().当您Position在该流上设置时,它将首先调用64位版本,该版本在调用32位版本时将值转换为Longint.(这可能会随着64位版本的Delphi而改变!)

另一方面,a THandleStream实现了64位版本Seek().当您Seek()使用32位值调用时,您最终会调用一个非常讨厌的机制来调用64位版本.

我的个人建议是设定Position.至少它将来是更好的选择.


Mar*_*ema 8

除了Position属性setter的函数调用开销之外,没有区别,因为设置Position属性调用Seek与给定值并从头开始:

procedure TStream.SetPosition(const Pos: Int64);
begin
  Seek(Pos, soBeginning);
end;
Run Code Online (Sandbox Code Playgroud)

  • SetPosition 的此实现将始终调用 64 位版本的eek,而直接调用 Seek 可能最终会得到 32 位版本。请参阅我的答案以了解差异。 (2认同)