2013-02-12 45 views
1

我最近读了迭代器和池中的the 2012 rationale部分。其中一个概括的是关于子池的新能力,一个没有答案的问题是子池和池池之间有什么区别 - 我的意思是,似乎可以像这样实现:(pg.25):新的Ada子池功能和池池有什么不同?

-- 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; 

虽然我承认我可能是非常错误的,因为我没有使用子池,更少的池(还)。

回答

0

来自Randy Brukardt的Comp.Lang.Ada

看点Storage_Pool仅适用于接入类型(13.11(15)和 等),然后键入湖不是一个访问类型,因此这是非法的(和 是没有意义的为好)。

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

还有最终确定的问题。子池机制确保 对象不超出其子池(指向对象 的指针可能比子池长,但不是对象本身),即使当子池被明确销毁时(就像 Unchecked_Deallocation一样)。如果没有 语言支持(我们在 中提到的每个手写子池实现都坚持认为没有受控,受保护或任务对象 从中分配,这显然是有限的),没有好方法。

让我向你保证,获得这个权利是困难和有争议的。这是 几乎下降了几次。自己动手不会是 有争议(我希望!),但它仍然很难。由于ARG有 已经完成了肮脏的工作,所以最好使用它。

          Randy.