是否有可能获得指针在Delphi 7中指向的类型的大小?

tru*_*ger 1 delphi memory-management delphi-7

我希望在以下函数中获得任何"记录"类型的大小.但似乎它不起作用:

function GetDataSize(P : Pointer) : Integer;
begin
  Result := SizeOf(P^); // **How to write the code?**
end;
Run Code Online (Sandbox Code Playgroud)

例如,后续记录的大小为8个字节

SampleRecord = record
 Age1 : Integer;
 Age2 : Integer;
end;
Run Code Online (Sandbox Code Playgroud)

GetDataSize(@a)总是返回1(当然,a是SampleRecord类型的变量).我该怎么办?

我注意到Delphi有一个程序过程New(var P:Pointer),可以分配内存块对应P指向的类型的大小.怎么能达到这个尺寸?

Rob*_*edy 7

原因New知道要分配多少内存New就是编译魔术.它是内置的语言,所以当编译器看到你调用它时,它会将它重写为如下所示:

// New(foo);
foo := System._New(SizeOf(foo^), TypeInfo(TypeOf(foo^)));
Run Code Online (Sandbox Code Playgroud)

TypeOf这是一个用于说明目的的Delphi函数.编译器知道声明的类型,foo因为它知道所有变量声明的位置.你可以看一下执行_NewSystem.pas.类似的重写是因为Dispose它知道在释放内存之前要做什么样的终结.

变量声明的思想是编译时的概念.在运行时,它们不复存在.在运行时,指针只是一个地址.它指向的类型是在编译时确定的.类型决定了某些东西的大小.

如果你需要编写一个接受指向不同大小的多个东西的指针的函数,那么你只需要提供第二个参数来描述第一个指向的东西.

在这里查看另一个问题," 如何知道var是什么类型." 提问者想知道如何仅根据地址确定有关变量的更多信息.