dephi FillChar 的几种写法

//在 delphi 新版中, char 已经是双字节了。故应该重新自己写一个函数,取名为 FillByte ,才无歧义。
procedure TForm1.Button2Click(Sender: TObject);
// 功能,将 Buff 数组快速填充为一个值,如 65
const
  MaxLen = 1024;
var
  Buff: array [0 .. MaxLen] of byte;
  p: PByte;
  i: integer;
begin
  p := @Buff[0];

  // 1 . 初学者写法。
  for i := 0 to MaxLen do
  begin
    Buff[i] := 65; // 如果 Buff 是 delphi 的 string 类型
    // 则 Buff[i] 会有一个定位元素的函数调用,代码效率降低了。
  end;

  // 2. 进阶者写法,也可以称之为明白人写法。
  // 此写法清晰明白地使用了指针,是常用的方法。
  // 即使 Buff 为 delphi 的 string 类型,仍然高效。
  for i := 0 to MaxLen do
  begin
    p^ := 65;
    inc(p);
  end;

  // 3. 怪异用法,这是语法特性, c 语言中也有这样的写法
  // 可以少写代码,省事。效率与方法2相当。
  for i := 0 to MaxLen do
    p[i] := 65;

end;

procedure TForm1.Button1Click(Sender: TObject);
// 功能,将 Buff 数组快速填充为某一个值,如 65 (16 进制0x41 )
const
  MaxLen = 1024;
var
  Buff: array [0 .. MaxLen] of byte;
  PB: PByte;
  PI: PInt64;
  D: int64;
  i, Count: integer;
begin
  // 方法4,高级用法。
  // 充分利用寄存器的长度,一次填充8个 Byte
  // 此写法综合评比最优写法。既高效,又灵活跨越各平台。
  PB := @Buff[0];
  PI := PInt64(PB);
  D := $4141414141414141; //

  Count := (MaxLen + 1) div 8;
  for i := 0 to Count - 1 do
  begin
    PI^ := D;
    inc(PI);
  end;

  // 填充剩余的位置
  Count := (MaxLen + 1) and $7; // 等同于 MaxLen mod $7;
  PB := PByte(PI);
  for i := 0 to Count - 1 do
  begin
    PB^ := $41;
    inc(PB);
  end;

end;

procedure TForm1.Button3Click(Sender: TObject);
// 功能,将 Buff 数组快速填充为某一个值,如 65 (16 进制 0x41 )
const
  MaxLen = 1024;
var
  Buff: array [0 .. MaxLen] of byte;
  p: pointer;
  i, Count: integer;
begin
  // 方法5 ,骨灰级写法
  // 惊天地,泣鬼神,为了效率,啥也不顾了。
  // 此为宇宙中效率最高写法,可惜,跨平台或有困难。
  Count := (MaxLen + 1) div 4;
  p := @Buff[0];
  asm
    cld;
    mov eax,$41414141; // 因为是32位,所以4个字节
    mov ecx,count;
    mov edi,p;
    rep stosd;
  end;
  Count := (MaxLen + 1) mod 4;
  if Count > 0 then
    asm
      cld
      mov eax,$41;
      mov ecx,count;
      mov edi,p;
      rep stosb;
    end;
end;

  

posted on 2017-04-19 09:03  晓不得2013  阅读(680)  评论(0编辑  收藏  举报

导航