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指向的类型的大小.怎么能达到这个尺寸?
原因New知道要分配多少内存New就是编译魔术.它是内置的语言,所以当编译器看到你调用它时,它会将它重写为如下所示:
// New(foo);
foo := System._New(SizeOf(foo^), TypeInfo(TypeOf(foo^)));
Run Code Online (Sandbox Code Playgroud)
TypeOf这是一个用于说明目的的Delphi函数.编译器知道声明的类型,foo因为它知道所有变量声明的位置.你可以看一下执行_New的System.pas.类似的重写是因为Dispose它知道在释放内存之前要做什么样的终结.
变量和声明的思想是编译时的概念.在运行时,它们不复存在.在运行时,指针只是一个地址.它指向的类型是在编译时确定的.类型决定了某些东西的大小.
如果你需要编写一个接受指向不同大小的多个东西的指针的函数,那么你只需要提供第二个参数来描述第一个指向的东西.
在这里查看另一个问题," 如何知道var是什么类型." 提问者想知道如何仅根据地址确定有关变量的更多信息.