zoukankan      html  css  js  c++  java
  • Delphi 系统[18]关键字和保留字 record、packed -定义结构类型

    Delphi 系统[18]关键字和保留字  record、packed -定义结构类型

    1、定义:

    • record :定义结构类型。 一个结构体可以视为一个不需要实例化的类(某些地方和对象用法不同)。 
    • packed :用于对结构类型对象或数组类型对象进行打包,打包后的对象体积能显著减小。打包后元素对齐位置也会发生变化,不再对齐到与 CPU 处理能力相匹配的位置,因此打包后的对象,处理速度会降低。详细信息请查阅相关资料。 

    2、示例:

    { 定义 record 类型 }
    type 
      TMyRec = record 
        Name: string; 
        Age: Cardinal; 
        Sex: Boolean; 
      end; 
     
    { 定义 record 类型,用法类似于 class } 
    type 
      TMyRec = record 
      private 
        FName: string; 
      public 
        procedure ShowResult; 
        property Name: string read FName write FName; 
      end; 
     
    { 实现 record 方法 } 
    procedure TMyRec.ShowResult; 
    begin 
      ShowMessage('调用成功!'); 
    end; 
     
    { 调用 record 方法 } 
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      MyRec: TMyRec; 
    begin 
      MyRec.Name := 'Record 测试'; 
      ShowMessage(MyRec.Name); 
      MyRec.ShowResult; 
    end; 
     
    ---------------------------------------------------------------------------------------
    {packed 打包 } 
    {结构化类型的实例包含多个值。结构化类型包括集合、数组、记录和文件以及类、类引用和接口类型。除了只包含序数值的集合外,结构化类型可以包含其他结构化类型;类型可以有无限的结构层次。
    默认情况下,结构化类型中的值在单词或双单词边界上对齐,以便更快地访问。当您声明结构化类型时,可以将保留字打包以实现压缩数据存储。}
    type 
      { 未打包 } 
      TMyRecA = record 
        Name: string; 
        Age: Byte; 
        Sex: Boolean; 
      end; 
     
      { 打包 } 
      TMyRecB = packed record 
        Name: string; 
        Age: Byte; 
        Sex: Boolean; 
      end; 
     
      { 未打包 } 
      TMyArrayA = array [0 .. 32] of Byte; 
     
      { 打包 } 
      TMyArrayB = packed array [0 .. 32] of Byte; 
     
    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
      ShowMessage(IntToStr(SizeOf(TMyRecA))); 
      ShowMessage(IntToStr(SizeOf(TMyRecB))); 
      ShowMessage(IntToStr(SizeOf(TMyArrayA))); 
      ShowMessage(IntToStr(SizeOf(TMyArrayB))); 
    end; 
    //使用压缩会减慢数据访问速度,对于字符数组,会影响类型兼容性(有关更多信息,请参阅内存管理)
    

    3、有关 record 的一些说明:

    record(类似于某些语言中的结构)表示一组异构元素。每个元素称为一个字段;记录类型的声明为每个字段指定名称和类型。

    记录类型声明的语法为:

    type 
        recordTypeName = record
            fieldList1: type1;
            ...
            fieldListn: typen;
    end
    

    其中recordTypeName是有效标识符,每个类型表示一个类型,每个fieldList是有效标识符或逗号分隔的标识符列表。最后的分号是可选的。

    例如,下面的声明创建了一个名为TDateRec的记录类型:

    type
      TDateRec = record
        Year: Integer;
        Month: (Jan, Feb, Mar, Apr, May, Jun, 
                Jul, Aug, Sep, Oct, Nov, Dec);
        Day: 1..31;
      end;
    
    • 每个TDateRec包含三个字段:一个名为Year的整数值、一个名为Month的枚举类型的值和另一个名为Day的介于1和31之间的整数。
    • 标识符Year、Month和Day是TDateRec的字段标识符,它们的行为类似于变量。

    但是,TDateRec类型声明不为年、月和日字段分配任何内存;实例化记录时会分配内存,如下所示:

    var Record1, Record2: TDateRec;
    

    此变量声明创建TDateRec的两个实例,称为Record1和Record2。

    通过使用记录的名称限定字段指示符,可以访问记录的字段:

    Record1.Year := 1904;
    Record1.Month := Jun;
    Record1.Day := 16;
    

    或使用with语句:

    with Record1 do
    begin
      Year := 1904;
      Month := Jun;
      Day := 16;
    end;
    

    现在,您可以将Record1字段的值复制到Record2:

    Record2 := Record1;
    

    因为字段指示符的作用域仅限于它出现的记录,所以您不必担心字段指示符和其他变量之间的命名冲突。

    您可以使用记录而不是定义记录类型。。。直接在变量声明中构造:

    var 
      S: record
      Name: string;
      Age: Integer;
    end;
    

    然而,这样的声明在很大程度上违背了记录的目的,即避免重复编码相似的变量组。此外,此类单独声明的记录将不具有分配兼容性,即使它们的结构相同。  

      

      

      

      

    创建时间:2021.08.12  更新时间:

    博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你所有帮助,谢谢!
  • 相关阅读:
    HDU 1716 排列2
    HDU 3405 World Islands
    HDU 5624 KK's Reconstruction
    HDU 2689 Tree
    UVA 12075 Counting Triangles
    UVA 11100 The Trip, 2007
    [USACO 2004DEC] Navigation Nightmare
    [USACO 2017DEC] Barn Painting
    [Usaco2017 Dec] A Pie for a Pie
    [USACO 2017DEC] Greedy Gift Takers
  • 原文地址:https://www.cnblogs.com/guorongtao/p/15131895.html
Copyright © 2011-2022 走看看