gpt4 book ai didi

delphi - Delphi (Win32) 中的相互引用记录

转载 作者:行者123 更新时间:2023-12-03 14:42:39 24 4
gpt4 key购买 nike

是否有任何解决方法可以在 Delphi 中创建相互引用记录?这是代码的简化版本:

MyRec1 = record
arr: MyRec2Array;
end;

MyRec2 = record
mr: MyRec1;
end;

MyRec2Array = array of MyRec2;

显然是记录类型的前向声明

MyRec2 = record;

在 Delphi for Win32 中不起作用。

切换到类而不是记录不好,因为这会增加内存消耗和代码复杂性,所以我宁愿继续使用记录。

有什么建议吗?

最佳答案

记录是值类型,而不是引用类型。这意味着用作较大数据结构成员的所有记录都内联放置在结构本身中,而不是作为指针。尝试创建两个相互包含的记录会使编译器在尝试找出记录的结构时陷入无限循环。这可能就是您无法前向声明记录的原因,即使您尝试在此处插入引用类型(动态数组),您仍然不能违反语言规则。

但是您可以将记录指针类型声明为前向声明,如下所示:

PMyRec2 = ^MyRec2
...
MyRec2 = record
...
end;

当然,一旦开始使用指向记录的指针,您就必须担心分配和释放内存,并且您试图通过不使用类来避免的代码复杂性出现在您的项目中。底线:通过类来做到这一点。将其中一个记录(如果不是全部)设为一个类。这确实是最简单的方法。

额外的内存开销可以忽略不计。它为每个引用提供一个指向对象的指针,无论如何,您都需要指向对象的指针,再加上 D2009 之前的每个实例一个隐藏字段(4 字节)或 D2009 或更高版本的其中两个隐藏字段(8 字节)。这根本不是很多。

关于delphi - Delphi (Win32) 中的相互引用记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3222626/

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