zoukankan      html  css  js  c++  java
  • 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;
    

      

  • 相关阅读:
    顺流交易中,母公司销售部分存货,为什么收入也是全额抵消?
    借:递延所得税资产(负债)贷:所得税费用
    可变回报与固定回报
    或有对价
    可以税前扣除什么意思
    应收账款保理为什么是筹资活动
    外币报表折算差额计入其他综合收益
    分配现金股利为什么是筹资
    spring的@EnableAspectJAutoproxy注解
    Spring的@DeclareParents注解
  • 原文地址:https://www.cnblogs.com/lackey/p/6731582.html
Copyright © 2011-2022 走看看