Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何获得给定变量的实际类型的内存大小?_Delphi_Variant - Fatal编程技术网

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