1

我最近阅读了 2012 年关于迭代器和池的基本原理部分。概述的一件事是关于子池的新能力,一个没有回答的问题是子池和池池之间的区别是什么——我的意思是,它似乎 [as pg.25] 可以这样实现:

-- Minnesota: Land of 10,000 Lakes
type Minnesota(Size: Storage_Count) is new Root_Storage_Pool with private;
type Lake(Size: Storage_Count) is new Root_Storage_Pool with private
     with Storage_Pool => Minnasota;
-- ...
type Pooled is [...] with Storage_Pool => Lake;

虽然我承认我可能大错特错,因为我没有使用子池,更不用说池(还)。

4

1 回答 1

0

来自 Comp.Lang.Ada 的 Randy Brukardt

Aspect Storage_Pool 仅适用于访问类型(13.11(15)等),而 Lake 类型不是访问类型,因此这是非法的(也没有任何意义)。

您可以通过将其他池放入其实现中来实现一个池(比如这里的明尼苏达州,包括一组 10000 个湖 :-)。但是你必须有一种方法来选择哪个项目属于每个,咳咳,子池。你会重新发明轮子。

还有最终确定的问题。子池机制确保对象不会超过它们的子池(指向对象的指针可能会超过子池,但不是对象本身),即使子池被提前明确销毁(就像 Unchecked_Deallocation 所做的那样)。如果没有语言支持,就没有好的方法可以做到这一点(我们谈到的每个手写子池实现都坚持不从中分配受控、受保护或任务对象,这显然是有限制的)。

让我向你保证,要做到这一点是困难和有争议的。几次差点掉下来。自己做不会有争议(我希望!),但仍然很难。由于 ARG 已经完成了脏活,所以最好使用它。

                                            Randy.
于 2013-02-17T01:12:02.073 回答