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 + -
显示快捷键?