首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PChar操作替换字符串赋值

用PChar操作替换字符串赋值
EN

Stack Overflow用户
提问于 2016-02-29 17:59:47
回答 1查看 322关注 0票数 2

我有一个令人费解的结果,我正在努力理解。

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

代码语言:javascript
复制
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^替换为基于指针的操作。这是我的尝试:

代码语言:javascript
复制
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)花费的时间是Result := Result + PC^的50倍。据我所知,这是因为在进入WStrPLCopy时,有一个对_WStrFromPWChar的调用,它似乎复制了比所需字符多得多的字符。我如何避免这种情况,或者是否有人可以建议一种替代的基于PChar的方法?

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

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

发布于 2016-02-29 20:37:23

我是这样写的:

代码语言:javascript
复制
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,这是对外部代码段的唯一调用)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35696594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档