gpt4 book ai didi

delphi - 用 PChar 操作替换字符串赋值

转载 作者:行者123 更新时间:2023-12-01 18:58:44 25 4
gpt4 key购买 nike

我有一个令人费解的结果,我很难理解。

我一直在尝试提高这个例程的速度

function TStringRecord.GetWord: String;
begin
// return the next word in Input
Result := '';

while (PC^ <> #$00) and not PC^.IsLetter do begin
inc(FPC);
end;

while (PC^ <> #$00) and PC^.IsLetter do begin
Result := Result + PC^;
inc(FPC);
end;
end;

通过将 Result := Result + PC^ 替换为基于指针的操作。这我的尝试是:

function TStringRecord.GetWord2: String;
var
Len : Integer;
StartPC,
DestPC : PChar;
begin
// return the next word in Input
Result := '';

while (PC^ <> #$00) and not PC^.IsLetter do begin
inc(FPC);
end;

Len := Length(Input);
SetLength(Result, Len);
StartPC := PChar(Result);
DestPC := PChar(Result);
while (PC^ <> #$00) and PC^.IsLetter do begin
WStrPLCopy(DestPC, PC, 1);
inc(FPC);
inc(DestPC);
end;
SetLength(Result, DestPC - StartPC);
end;

根据我的线路分析器,WStrPLCopy(DestPC, PC, 1) 花费了 50 倍的时间比 结果 := 结果 + PC^。据我所知,这是因为在进入时WStrPLCopy 有一个对 _WStrFromPWChar 的调用,它似乎复制了更多字符比必要的字符多。我怎样才能避免这种情况,或者有人可以建议另一种基于 PChar 的方法?

我的代码的其余部分如下:

TStringRecord = record
private
FPC: PChar;
FInput: String;
procedure SetInput(const Value: String);
public
function NextWord : String;
function NextWord2 : String;
property Input : String read FInput write SetInput;
property PC : PChar read FPC;
end;

procedure TStringRecord.SetInput(const Value: String);
begin
FInput := Value;
FPC := PChar(Input);
end;

最佳答案

这就是我的写法:

function TStringRecord.GetWord: String;
var beg: PChar;
begin
// return the next word in Input
while (FPC^ <> #0) and not FPC^.IsLetter do
inc(FPC);
beg := FPC;
while (FPC^ <> #0) and FPC^.IsLetter do
inc(FPC);
SetString(result, beg, FPC-beg);
end;

有了这个,代码的可读性非常好,并且您只有一个内存分配,我猜您无法更快地编写任何内容(但是通过内联 PC^.IsLetter ,这是对外部代码)。

关于delphi - 用 PChar 操作替换字符串赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35696594/

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