最近我读了一本书,详细描述了堆内存碎片的情况,这让我开始思考我的项目。例如,在以下方式中使用ptr_container(来自Boost)时:
ptr_array<A> arr; //
arr.push_back(new A()); // a1.
arr.push_back(new A()); // a2.
arr.push_back(new A()); // a3.
....
当替换元素时,很快会导致一些内存碎片。为了论证,假设实际容器可以容纳我们提供给它的所有指针。堆看起来会像这样:
[arr_array][a1][a2][a3]...[aN]
当我们开始用一个子类型(大小更大)替换指针时,情况就会改变。假设我们将所有由奇数指针(a1、a3、...)引用的对象替换为较大的类型,则结果如下所示:
[arr_array][xx][a2][xx][a4]...[aN][b1][b3]...[bN]
在这里,[xx]表示未使用的空间,b1...bN是新对象。
所以我想要一个容器来存储对象(就像STL容器一样),但支持多态存储。我知道如何实现这种容器,但更喜欢使用“专家”库(Boost,STL等)。总之,我的问题是:
是否有一种容器支持在连续的内存序列中保存(动态分配的)多态对象?
例如,内存布局可以如下所示:
[arr_array] = [ptr_lookup_table][storage]
= [p1, p2, ..., pn][b1, a2, b3, ..., aN]
感谢您的回答/评论!