📄 alignsize.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 + -