alignsize.dpr

来自「delphi开发语言下的源代码分析」· DPR 代码 · 共 64 行

DPR
64
字号
program AlignSize;

{$APPTYPE CONSOLE}

type
  PUsed = ^TUsed;
  TUsed = packed record
    sizeFlags: Integer;
  end;

const
  cAlign        = 4;
  cThisUsedFlag = 2;
  cFillerFlag   = Integer($80000000);
  cPrevFreeFlag = 1;
  cFlags        = cThisUsedFlag or cPrevFreeFlag or cFillerFlag;

// 取指针所指向内存块的对齐长度
function GetAlignSize(const p : pointer) : integer; overload;
var
  u : PUsed;
begin
  u := p;
  dec(u);
  result := u.sizeFlags and not cFlags;
end;

// 取字符串的内存占用的对齐长度
function GetAlignSize(const Str : string) : integer; overload;
var
  p : PInteger;
begin
  p := Pointer(Str);
  dec(p, 2);
  Result := GetAlignSize(Pointer(p));
end;

// 计算对齐长度
function CalcAlignSize(Size : Integer) : Integer;
begin
  Result := (Size + SizeOf(TUsed) + (cAlign-1)) and not (cAlign-1);
  if Result < 12 then  // SizeOf(TFree) = 12
    Result := 12;
end;

var
  Str : String;
  p : Pointer;

begin
  GetMem(p, 10);
  Writeln('直接获取: ', GetAlignSize(p));
  Writeln('  计算值: ', CalcAlignSize(10));

  Str := '0123456789';
  Writeln('直接获取: ', GetAlignSize(Str));
  Writeln('  计算值: ', CalcAlignSize(SizeOf(Integer)*2 + Length(Str) + 1));

  GetMem(p, 1);
  Writeln('最小块长: ', GetAlignSize(p));

readln;
end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?