⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alignsize.dpr

📁 delphi开发语言下的源代码分析
💻 DPR
字号:
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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -