gpt4 book ai didi

arrays - Delphi TBytes - 如何复制?

转载 作者:行者123 更新时间:2023-12-02 13:45:02 27 4
gpt4 key购买 nike

这里的重点是优化。

现在:

type TSomeClass=class(TObject)
private
DataWrite: TBytes;
...
end;

Function TSomeClass.GetPacket: TBytes;
begin
SetLength(Result, Length(DataWrite));
Move(DataWrite[0],Result[0],Length(DataWrite));
end;

我想要实现的目标:

Function TSomeClass.GetPacket: TBytes;
begin
Result := DataWrite;
end;

因为 Delphi 中的数组是指向第一个元素的指针,后者仅写入 4 个字节,因此速度要快得多。这是正确的吗?

最佳答案

您需要注意的一件事是,与字符串不同,动态数组不是“写时复制”。

如果分配字符串或动态数组,则仅复制指向堆上数据的指针,并且引用计数会递增。

但是对于字符串,如果您写入引用计数 > 1 的字符串(例如 s[1] := 'a'),编译器将发出代码以确保首先复制该字符串。动态数组的情况并非如此:

var 
s, t: string;
a, b: TBytes;
begin
s := 'abc';
t := s;
t[2] := 'X';
WriteLn(s); //still abc

a := TBytes.Create(1, 2, 3);
b := a;
b[1] := 0;
WriteLn(a[1]); // is now 0 not 2!

因此,对于您的代码,如果您在调用 GetPacket 后更改 DataWrite 的内容,则更改将在 GetPacket 返回的 TByte 中可见。

对于实际复制数组的代码,您可以使用:

,而不是调用 SetLength And Move
function TSomeClass.GetPacket: TBytes;
begin
Result := Copy(DataWrite, 0, High(Integer));
end;

关于arrays - Delphi TBytes - 如何复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4942455/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com