C++ 在C+中是否可以强制执行连续分配边界+;模板?
简单的例子:C++ 在C+中是否可以强制执行连续分配边界+;模板?,c++,templates,memory,boundary,C++,Templates,Memory,Boundary,简单的例子: template <class P> class MyT { struct Item { public: Item() {} P *pData; Item *next; }; Item *head; public: ...adding etc.. P* operator [](int index) { See question below:
template <class P> class MyT
{
struct Item
{
public:
Item() {}
P *pData;
Item *next;
};
Item *head;
public:
...adding etc..
P* operator [](int index)
{
See question below:
}
};
我的意思是什么
Item* pi = (head + (index - 1));
他做这项工作。顺便问一下,你确定要这样做吗<代码>结构项看起来像链表结构(包含
下一个
)。我想你需要的是一个std::list或std::vector
然而,如果您已经为项目分配了顺序内存,并且head与Yossarian建议的修改一起指向开始,那么您正在尝试的方法将起作用
如果超过此限制,您可以在初始化时进行预分配,分配更多内容并将内容复制到该区域,从而释放现有资源
注意:所有这些东西都包装在std容器中。取决于“添加等”中“等”的含义
如果“ETC”包括“删除”,那么你就有一个明显的问题,如果你在列表的中间删除了一些东西,那么为了维护索引,你必须在它向下之后移动所有的东西,这意味着更新所有的<代码>下< /代码>指针。 我想也许你把你的例子简化得太过分了。如果需要连续存储,请使用向量(如果已删除的
项中有有用的内容,请使用P
或项
)。如果您有连续存储,那么使用next
指针没有任何好处,因为您可以在Item
中计算它,方法是将1添加到this
(然后检查一个绑定以确保尚未到达末尾)
如果您确实需要publicnext
指针字段,因为它是您正在实现的某个接口的一部分,您无法更改,那么您可以在复制构造函数和operator=
中为项
更新它,并且该接口最好禁止客户端向其写入
如果这是您的要求,则无法告诉内存分配器为单独的分配分配连续存储。那怎么行呢?如果您来分配时,“下一个”地址已被占用,该怎么办?如果分配器为其自己的控制结构(几乎所有的通用分配器都是这样)施加了一些开销,因此分配项
需要超过sizeof(Item)
字节,该怎么办?您可以使用一段时间来获得所需的行为,但最终它需要一个新块,或者您删除了一些内容,而这种关系不再成立。可以通过特殊的gcc关键字强制执行“内存边界”
查看“对齐”如果我正确理解您的问题,您需要覆盖项的运算符new
,并让分配器预先分配足够的内存来存储您将需要的所有项(这在一般情况下不可能,但在您的特定场景中可能)。然后,每当更新项时,分配器将返回预分配块中的下一个插槽
所有这些看起来都不现实,简单的解决方案是使用std::vector
仅在一次扫描中分配时有效。。。虽然这很奇怪,但结构并没有暗示这一点。我建议使用[]或next()-不能同时使用两者。您还必须确保数组被分配到一个大的块中,尽管下一步建议使用任意指针。你可能想看看QList(这是一个带有indizes afaik的链表。看看源代码)你有没有不使用标准库容器的具体原因?@Ronny:这只是一个非常简单的例子,来说明我需要知道的:如果有一种强制内存边界的标准方法,我可以使用,不用自己维护缓冲区。@Georg:我现在用的是STD的东西;我正在处理大量数据并需要优化-此选项是我正在考虑的可能性之一。我怀疑你的意思是+sizeof(Item)*(index-1)
,因为head
已经是Item*
类型。删除非常罕见(在我的情况下),我希望尽可能快地进行检索。@slashmais:如果中间的delete-and-insert的性能不重要,那么使用向量而不是链表。如果您需要链表的大致特征,但希望通过索引进行更快的查找,可以尝试使用跳过列表:。我不知道跳过列表-这看起来很有希望。在我的一次优化尝试中,我实现了一些与之几乎相似的东西:),但像往常一样,怀疑悄然而至&我开始寻找更传统的技术,因为我最终(很快)会将项目开源。这是一次尝试:在经历了大约三年的怀疑和沮丧之后。(你不会相信调查这个项目把我带到了哪里)@slashmais:是的,拥有一个被聪明人证明是正确的算法并发表了一篇同行评议的论文总是很好的,而不是我发明的在信封背面似乎起作用的东西:-)
Item* pi = (head + (index - 1));