gpt4 book ai didi

delphi - 为什么 TValue.Make 需要一个指向对象引用的指针?

转载 作者:行者123 更新时间:2023-12-03 14:46:59 30 4
gpt4 key购买 nike

我一直认为 Delphi 中的对象实际上是对内存位置的引用,而我想象这些内存位置存储为指针变量。

现在,我想从一个对象创建一个 TValue。考虑一下:

TValue.Make(AObject, TypeInfo(TMyObject), val);

其中val:TValue。这行不通。事实上,后续使用 val 将导致访问冲突。但是,如果我们使用寻址运算符,如下所示:

TValue.Make(@AObject, TypeInfo(TMyObject), val);

一切都很好。对我来说,这是出乎意料的,因为我认为 AObject 实际上(在幕后)是一个指针。我错了还是这是 TValue.Make 方法的怪癖?有人可以启发我吗?

最佳答案

procedure Foo;
var
I: Integer; // value type
O: TObject; // reference type
begin
@I; // Get a pointer to I
O := TObject.Create;
@O; // Get a pointer to the memory "behind" the reference O
end;
  • 位置 @I 以及 O(引用)的位置都在堆栈上。
  • 另一方面,位置 @O 位于堆上。

通常这并不重要,因为编译器知道何时取消引用以及何时不取消引用。

对于TValue.Make,该函数采用一个指针。

  • 当您指定 Make(O... 时,编译器会将引用硬转换为指针(指向堆栈)。
  • 当您指定 Make(@O... 时,编译器将首先取消引用,然后创建一个指向堆上位置的指针。

所以在这种情况下你必须给编译器一个提示,因为它不知道 TValue.Make 需要哪种类型的指针。

关于delphi - 为什么 TValue.Make 需要一个指向对象引用的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8034969/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com