请教下面的代码有什么区别啊:
[code]
type
  PFileInfo = ^TFileInfo;  //文件信息
  TFileInfo = record
              FName: string[255];     //文件名 256
              FTime: Integer;        //时间日期    4
              FSize: Int64;          //大小    8
              FAttr: Integer;        //属性    4 
    end;
//第一种种方法    
 procedure GetFileList(Dir : string;AStream: TStream); //文件列表 
var
  SearchRec:TSearchrec;
  FileInfo:PFileInfo;
begin
  GetMem(FileInfo,SizeOf(TFileInfo));
  AStream.Size := 0;
  if findFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then
    repeat
      if SearchRec.Name = '.' then Continue ;
      FillChar(FileInfo^,SizeOf(TFileInfo),#0);
      FileInfo^.FName := SearchRec.Name;
      FileInfo^.FTime := SearchRec.Time ;
      FileInfo^.FSize := SearchRec.Size ;
      FileInfo^.FAttr := SearchRec.Attr;
      AStream.WriteBuffer(FileInfo^,SizeOf(TFileInfo));
    until findNext(SearchRec)<>0 ;
  findClose(SearchRec);
  FreeMem(FileInfo );
end;
//第二种方法
procedure ListFile2(Dir : string; AStream : TStream); //不用指针什么的
var
  SearchRec : TSearchRec;
  FileInfo : TFileInfo;
begin
  AStream.Size := 0;
  if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
    repeat
      if SearchRec.Name = '.' then   Continue;
      FileInfo.IsDrive := False;
      FileInfo.FName := SearchRec.Name; //文件名
      FileInfo.FTime := SearchRec.Time; //时间
      FileInfo.FSize := SearchRec.Size; //大小
      FileInfo.FAttr := SearchRec.Attr; //属性
      AStream.WriteBuffer(FileInfo, SizeOf(TFileInfo)); //循环写入流
    until FindNext(SearchRec) <> 0;
  FindClose(SearchRec);
end;
[/code]请问两种方法有什么不同,好像效果一样啊,是效率不同吗?

解决方案 »

  1.   


    怎么看不到代码
    type
      PFileInfo = ^TFileInfo;  //文件信息
      TFileInfo = record
                  FName: string[255];     //文件名 256
                  FTime: Integer;        //时间日期    4
                  FSize: Int64;          //大小    8
                  FAttr: Integer;        //属性    4 
        end;
     //第一种方法   
     procedure GetFileList(Dir : string;AStream: TStream); //文件列表 
    var
      SearchRec:TSearchrec;
      FileInfo:PFileInfo;
    begin
      GetMem(FileInfo,SizeOf(TFileInfo));
      AStream.Size := 0;
      if findFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then
        repeat
          if SearchRec.Name = '.' then Continue ;
          FillChar(FileInfo^,SizeOf(TFileInfo),#0);
          FileInfo^.FName := SearchRec.Name;
          FileInfo^.FTime := SearchRec.Time ;
          FileInfo^.FSize := SearchRec.Size ;
          FileInfo^.FAttr := SearchRec.Attr;
          AStream.WriteBuffer(FileInfo^,SizeOf(TFileInfo));
        until findNext(SearchRec)<>0 ;
      findClose(SearchRec);
      FreeMem(FileInfo );
    end;
    //第二种方法
    procedure ListFile2(Dir : string; AStream : TStream);
    var
      SearchRec : TSearchRec;
      FileInfo : TFileInfo;
    begin
      AStream.Size := 0;
      if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
        repeat
          if SearchRec.Name = '.' then   Continue;
          FileInfo.IsDrive := False;
          FileInfo.FName := SearchRec.Name; //文件名
          FileInfo.FTime := SearchRec.Time; //时间
          FileInfo.FSize := SearchRec.Size; //大小
          FileInfo.FAttr := SearchRec.Attr; //属性
          AStream.WriteBuffer(FileInfo, SizeOf(TFileInfo)); //循环写入流
        until FindNext(SearchRec) <> 0;
      FindClose(SearchRec);
    end;
      

  2.   

    很明显第二种好,少了GetMem和FreeMem两个方法,你可以跟源代码,看看这两个方法到底干了多少事情。
    这就是所谓的栈的分配和回收速度比堆要快的体现。
    其实栈分配内存只要把ESP寄存器中的指针移动一下位置就行了。
      

  3.   

    如果是过程内部用,都没什么问题,第一种更好一些;如果是要是过程外调用,比如生成很多FileInfo,放入List,一定得用指针方式。