delphi - 是否可以获取Delphi 7中指针指向的类型的大小?

标签 delphi memory-management delphi-7

我想在以下函数中获取任何“记录”类型的大小。但似乎不起作用:

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


例如,以下记录的大小为8个字节

SampleRecord = record
 Age1 : Integer;
 Age2 : Integer;
end;


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

我注意到Delphi有一个过程程序New(var P:Pointer),可以分配与P指向的类型的大小相对应的存储块。如何获得尺寸?

最佳答案

New知道要分配多少内存的原因是New是编译器不可思议的。这是一种内置语言,因此当编译器看到您调用它时,它会将其重写为以下形式:

// New(foo);
foo := System._New(SizeOf(foo^), TypeInfo(TypeOf(foo^)));


TypeOf这是出于说明目的的虚构Delphi函数。编译器知道foo的声明类型,因为它知道所有变量声明在哪里。您可以在System.pas中查看_New的实现。 Dispose也会发生类似的重写,因此它知道在释放内存之前要执行哪种终结处理。

变量和声明的思想是编译时概念。在运行时,它们不再存在。在运行时,指针只是一个地址。指向的类型在编译时确定。类型决定什么东西的大小。

如果您需要编写一个函数来接受指向大小不同的多个事物的指针,则只需提供第二个参数来描述第一个参数所指向的内容。

在这里查看另一个问题“ How to know what type is a var”。询问者想知道如何在仅给出变量地址的情况下确定有关该变量的更多信息。

关于delphi - 是否可以获取Delphi 7中指针指向的类型的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/969007/

相关文章:

objective-c - 等待 RestKit 对象管理器完成初始化

c++ - 除了使用 OpenCV 的 imdecode 之外,还有其他选择吗?太慢了

delphi 2006,自定义组件中的SynTaskDialog编译错误

android - 如何使图像的一部分透明?

delphi - EVR:视频窗口上的透明文本输出

delphi - 具有Onclick的自定义按钮,隐藏Onclick事件

delphi - 如何在 Delphi 7 中获取日文字符

delphi - 让放置在 IDE 中我的控件上的组件成为我的控件的子级

linux - 共享内存的页面缓存

delphi - 使用 Delphi 7 从 MP3 文件中删除或编辑 ID3Tag 版本 2