Delphi 如何获得给定变量的实际类型的内存大小?
考虑以下代码:Delphi 如何获得给定变量的实际类型的内存大小?,delphi,variant,Delphi,Variant,考虑以下代码: 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('Si
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
)
如何获取给定变量的实际类型的内存大小?如果您的变量是
变量
,则无论存储什么值,它都将在Win32下使用(至少)16个字节,在Win32下使用24个字节
此变量的内存大小始终是变量
结构中的一个,在System.pas
中定义为TVarData
定义:
var
IntVariant: Variant;
事实上,这与定义:
var
IntVariant: TVarData;
使用一些初始化/终结魔法:
var
IntVariant: TVarData;
begin
IntVariant.VType := varEmpty;
try
...
finally
VarClear(variant(IntVariant));
end;
end;
如果不存储任何内容(
varEmpty
或varNull
),它仍将使用16/24字节。如果存储一个布尔值
,它仍将使用16/24字节。如果它存储了一些字符串
,则必须将堆分配的存储文本值添加到16/24字节。如果变量是变量
,则无论存储什么值,它都将在Win32下使用(至少)16字节,在Win32下使用24字节
此变量的内存大小始终是变量
结构中的一个,在System.pas
中定义为TVarData
定义:
var
IntVariant: Variant;
事实上,这与定义:
var
IntVariant: TVarData;
使用一些初始化/终结魔法:
var
IntVariant: TVarData;
begin
IntVariant.VType := varEmpty;
try
...
finally
VarClear(variant(IntVariant));
end;
end;
如果不存储任何内容(
varEmpty
或varNull
),它仍将使用16/24字节。如果存储一个布尔值
,它仍将使用16/24字节。如果它存储了一些字符串
,则必须将堆分配的存储文本值添加到16/24字节。您可以创建如下函数:
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.
程序项目1;
{$APPTYPE控制台}
使用
变体,SysUtils;
函数GetVarTypeSize(AVarType:TVarType;var isArray:boolean):整数;
开始
isArray:=AVarType(AVarType和VarTypeMask);
case AVarType和VarTypeMask的
varSmallInt:result:=SizeOf(SmallInt);
varInteger:result:=SizeOf(整数);
varSingle:结果:=SizeOf(Single);
varDouble:result:=SizeOf(Double);
varCurrency:result:=SizeOf(货币);
varDate:result:=SizeOf(TDateTime);
varOleStr:result:=SizeOf(PWideChar);
varDispatch:result:=SizeOf(指针);
varError:result:=SizeOf(HRESULT);
varBoolean:result:=SizeOf(WordBool);
varUnknown:result:=SizeOf(指针);
varShortInt:result:=SizeOf(ShortInt);
varByte:result:=SizeOf(字节);
varWord:result:=SizeOf(Word);
varLongWord:result:=SizeOf(LongWord);
varInt64:结果:=SizeOf(Int64);
varUInt64:结果:=SizeOf(UInt64);
varString:result:=SizeOf(指针);
varAny:result:=SizeOf(指针);
varArray:result:=SizeOf(PVarArray);
varByRef:result:=SizeOf(指针);
varUString:result:=SizeOf(指针);
varRecord:result:=SizeOf(TVarRecord);
其他的
结果:=-1//未知的
结束;
结束;
变量
v:变体;
b:布尔型;
开始
v:=3.141592654;//双重的
写入(GetVarTypeSize(VarType(v),b));
如果b那么WriteLn(':Is array'),否则WriteLn;
v:=3;//字节
写入(GetVarTypeSize(VarType(v),b));
如果b那么WriteLn(':Is array'),否则WriteLn;
v:=整数(3);//整数
写入(GetVarTypeSize(VarType(v),b));
如果b那么WriteLn(':Is array'),否则WriteLn;
v:=现在;//日期时间
写入(GetVarTypeSize(VarType(v),b));
如果b那么WriteLn(':Is array'),否则WriteLn;
v:=VarArrayCreate([0,9],varDouble)//阵列!仔细的
写入(GetVarTypeSize(VarType(v),b));
如果b那么WriteLn(':Is array'),否则WriteLn;
ReadLn;
结束。
此处VarTypeMask
将屏蔽定义变量数组的位。如果基变量是数组类型,屏蔽它将告诉您数组元素的类型
您可以阅读更多内容。您可以创建如下函数:
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.
程序项目1;
{$APPTYPE控制台}
使用
变体,SysUtils;
函数GetVarTypeSize(AVarType:TVarType;var isArray:boolean):整数;
开始
isArray:=AVarType(AVarType和VarTypeMask);
case AVarType和VarTypeMask的
varSmallInt:result:=SizeOf(SmallInt);
varInteger:result:=SizeOf(整数);
varSingle:结果:=SizeOf(Single);
varDouble:result:=SizeOf(Double);
varCurrency:result:=SizeOf(货币);
varDate:result:=SizeOf(TDateTime);
varOleStr:result:=SizeOf(PWideChar);
varDispatch:result:=SizeOf(指针);
varError:result:=SizeOf(HRESULT);
varBoolean:result:=SizeOf(WordBool);
varUnknown:result:=SizeOf(指针);
varShortInt:result:=SizeOf(ShortInt);
varByte:result:=SizeOf(字节);
varWord:result:=SizeOf(Word);
varLongWord:result:=SizeOf(LongWord);
varInt64:结果:=SizeOf(Int64);
varUInt64:结果:=SizeOf(UInt64);
varString:result:=SizeOf(指针);
varAny:result:=SizeOf(指针);
varArray:result:=SizeOf(PVarArray);
varByRef:result:=SizeOf(指针);
varUString:result:=SizeOf(指针);
varRecord:result:=SizeOf(TVarRecord);
其他的
结果:=-1//未知的
结束;
结束;
变量
v:变体;
b:布尔型;
开始
v:=3.141592654;//双重的
写入(GetVarTypeSize(VarType(v),b));
如果b那么WriteLn(':Is array'),否则WriteLn;
v:=3;//字节
写入(GetVarTypeSize(VarType(v),b));
如果b那么WriteLn(':Is array'),否则WriteLn;
v:=整数(3);//整数
写入(GetVarTypeSize(VarType(v),b));
如果b那么WriteLn(':Is array'),否则WriteLn;
v:=现在;//日期时间
写入(GetVarTypeSize(VarType(v),b));
如果b那么WriteLn(':是a