【问题标题】:Reset all values to default in dynamic array将动态数组中的所有值重置为默认值
【发布时间】:2019-05-11 17:46:22
【问题描述】:

请看我的代码:

var
  b: array of Boolean;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLength(b,3); //All values are False by default
  b[0]:=True;
  //Do something here
  SetLength(b,0);
  SetLength(b,3); 
end;

我测试了b[0]=False

我的问题:使用SetLength(b,0) 然后SetLength(b,n) 将所有值重置为默认值(假)的正确方法吗? 是b[0]=False 在所有情况下,还是True 在某些情况下?

【问题讨论】:

    标签: delphi delphi-xe7


    【解决方案1】:

    SetLength() 零初始化它分配的内存,所以是的,默认情况下布尔值始终为 False。

    话虽如此,与其重新分配数组,不如考虑手动重置布尔值:

    var
      b: array of Boolean;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: integer;
    begin
      SetLength(b,3); //All values are False by default
      b[0] := True;
      //Do something here
      for I := 0 to High(b) do
        b[I] := False; // or Default(Boolean)
    end;
    

    或者,您可以使用FillChar()ZeroMemory() 用零填充分配的内存:

    var
      b: array of Boolean;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SetLength(b,3); //All values are False by default
      b[0] := True;
      //Do something here
      ZeroMemory(@b[0], Length(b)); // or FillChar(b[0], Length(b), $0);
    end;
    

    【讨论】:

    • @LuanXa 考虑第二个选项,使用ZeroMemory()。这是 AFAIK 重置内存的最快方法。
    • 堆分配是缓慢的部分。 4 个布尔值不会成为瓶颈。
    • "ZeroMemory 比 Loop For 快吗?" - 你应该分析你的代码并自己找出时间,但是 SetLength(...,0); SetLength(...,n); 肯定不会比 Loop For 更快只是填充一个已经存在的内存块。
    • AFAIK; FillChar 是 Windows 中性能最高的。不确定哪个(ZeroMemory 或 FillChar)在其他平台上更快。两者肯定都比简单循环或SetLength(x, 0); SetLength(x, n); 更快。
    • @RudyVelthuis 取决于使用的实现,ZeroMemory() 要么是同名的 Win32 函数,要么是只调用 FillChar() 的 RTL 包装器。
    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2019-08-17
    • 2016-08-19
    • 2016-12-28
    • 1970-01-01
    相关资源
    最近更新 更多