gpt4 book ai didi

delphi - 如何获取给定变体的实际类型的内存大小?

转载 作者:行者123 更新时间:2023-12-02 07:22:31 24 4
gpt4 key购买 nike

考虑以下代码:

procedure Test;
var
IntGenuine: UInt64;
IntVariant: Variant;

begin
IntGenuine := 0;
IntVariant := UInt64(0); // The type of the variant is UInt64 now

WriteLn('Size of IntGenuine = ', SizeOf(IntGenuine)); // Output: 8
WriteLn('Size of IntVariant = ', SizeOf(IntVariant)); // Output: 24
end;

我知道语句 SizeOf(IntVariant) 等同于 SizeOf(Variant)。它获取类型 Variant 的大小,而不是变体实际类型的大小(在本例中为 UInt64)。

如何获取给定变体的实际类型的内存大小?

最佳答案

您可以创建一个类似这样的函数:

Program Project1;

{$APPTYPE CONSOLE}
uses
Variants, SysUtils;

function GetVarTypeSize(AVarType : TVarType; var isArray : boolean) : integer;
begin

isArray := AVarType <> (AVarType and VarTypeMask);

case AVarType and VarTypeMask of
varSmallInt: result := SizeOf(SmallInt);
varInteger: result := SizeOf(Integer);
varSingle: result := SizeOf(Single);
varDouble: result := SizeOf(Double);
varCurrency: result := SizeOf(Currency);
varDate: result := SizeOf(TDateTime);
varOleStr: result := SizeOf(PWideChar);
varDispatch: result := SizeOf(Pointer);
varError: result := SizeOf(HRESULT);
varBoolean: result := SizeOf(WordBool);
varUnknown: result := SizeOf(Pointer);
varShortInt: result := SizeOf(ShortInt);
varByte: result := SizeOf(Byte);
varWord: result := SizeOf(Word);
varLongWord: result := SizeOf(LongWord);
varInt64: result := SizeOf(Int64);
varUInt64: result := SizeOf(UInt64);
varString: result := SizeOf(Pointer);
varAny: result := SizeOf(Pointer);
varArray: result := SizeOf(PVarArray);
varByRef: result := SizeOf(Pointer);
varUString: result := SizeOf(Pointer);
varRecord: result := SizeOf(TVarRecord);
else
result := -1; //unknown
end;
end;

var
v : Variant;
b : boolean;
begin
v := 3.141592654; // double
Write(GetVarTypeSize(VarType(v), b));
if b then WriteLn(' : Is array') else WriteLn;

v := 3; // byte
Write(GetVarTypeSize(VarType(v), b));
if b then WriteLn(' : Is array') else WriteLn;

v := integer(3); // integer
Write(GetVarTypeSize(VarType(v), b));
if b then WriteLn(' : Is array') else WriteLn;

v := Now; // DateTime
Write(GetVarTypeSize(VarType(v), b));
if b then WriteLn(' : Is array') else WriteLn;

v := VarArrayCreate([0,9], varDouble); //array ! careful
Write(GetVarTypeSize(VarType(v), b));
if b then WriteLn(' : Is array') else WriteLn;

ReadLn;
end.

这里VarTypeMask将屏蔽定义变体数组的位。如果基本变体是数组类型,则屏蔽它会告诉您数组元素的类型。

您可以阅读更多in the documentation .

关于delphi - 如何获取给定变体的实际类型的内存大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32759140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com