• Delphi中的内存对齐 与 Packed关键字


    以delphi为例:
    TTest = record
    c1: char;
    i1: Integer;
    c2: char;
    c3: Char;
    end;
    这个结构如果用sizeof取其占用的内存大小,是多少呢,是1+4+1+1=7么,不是,是4*3 = 12; 这是因为32位编译的时候,默认结构会自动内存对齐(32bit = 4byte)。

    如果要想让这个结构占用7个字节的话,必须加上packed关键字。如下:
    TTest = packed record
    c1: char;
    i1: Integer;
    c2: char;
    c3: Char;
    end;

    在windows中内存的分配一次是4个字节的。而packed按字节进行内存的申请和分配,这样速度要慢一些,因为需要额外的时间来进行指针的定位。因此如果不用packed的话,delphi将按一次4个字节的方式申请内存,因此如果一个变量没有4个字节宽的话也要占4个字节!这样就浪费了,你可以用packed关键字取消这种优化。

    例子: 
    type 
    myrec = packed record 
    n1 : integer; 4个字节 
    n2 : shortint; 1个字节 
    end; 
    sizeof(myrec)------ 5 

    type 
    myrec = record 
    n1 : integer; 
    n2 : shortint; 
    end; 
    sizeof(myrec)------ 8

    Record的数据各个字节都是对齐的,数据格式比较完整,所以这种格式相对packed占用的内存比较大,
    但是因为格式比较整齐,所以电脑读取这个类型的数据的时候速度比较快。

    而Packed Record对数据进行了压缩,节省了内存空间,当然他的速度也变的慢了。

    type 
    // Declare an unpacked record 
    TDefaultRecord = Record 
    name1 : string[4]; 
    floater : single; 
    name2 : char; 
    int : Integer; 
    end; 
    // Declare a packed record 
    TPackedRecord = Packed Record 
    name1 : string[4]; 
    floater : single; 
    name2 : char; 
    int : Integer; 
    end; 
    var 
    defaultRec : TDefaultRecord; 
    packedRec : TPackedRecord; 
    begin 
    ShowMessage('Default record size = '+IntToStr(SizeOf(defaultRec))); 
    ShowMessage('Packed record size = '+IntToStr(SizeOf(packedRec))); 
    end; 

    Default record size = 20 
    Packed record size = 14

    不过,对于现在的操作系统来,packed Record 节省的那些空间已不用考虑他了。除了做DLL(不用packed容易造成内存混乱)和做硬件
    编程时(比如串口)编程时必须用到packed Record,其它情况都可以用Record

    http://blog.csdn.net/procedure1984/article/details/3057730

  • 相关阅读:
    CodeForces 7B
    CodeForces 4D
    离散化
    线段树入门
    洛谷 P3951 小凯的疑惑(赛瓦维斯特定理)
    Codeforces 1295D Same GCDs (欧拉函数)
    Codeforces 1295C Obtain The String (二分)
    Codeforces 1295B Infinite Prefixes
    Codeforces 1295A Display The Number(思维)
    Codeforces 1294F Three Paths on a Tree(树的直径,思维)
  • 原文地址:https://www.cnblogs.com/semth/p/10509105.html
Copyright © 2020-2023  润新知