【问题标题】:Making a pool concept in c++在 C++ 中创建池概念
【发布时间】:2012-08-19 08:51:54
【问题描述】:

我有一个结构

struct Employee 
{ 
 char   uName  [255]; 
 struct   Employee *  next; 
 struct   Employee *  prev; 
};

我想一次分配 100 个结构对象的内存,然后一个一个地使用它们,我制作一个链表。如果内存被完全消耗,那么我想再次分配 100 个对象内存

我正在做分配

struct Employee * chunk=new struct Employee[100];

现在,当我想向链表添加一个新节点时,我想从这个已分配的内存中获取对象。有人可以告诉我如何实现这一点

Employee * pEmployeeData=NULL;
for(long int i=1;i<=100;i++)
{
        pEmployeeData=EmployeePool+i;
        pEmployeeData->next=NULL;
        pEmployeeData->prev=NULL;
        InsertAtEnd(pEmployeeData);
}

InsertAtEnd在链表末尾插入节点。请告诉如何实现

【问题讨论】:

  • 我最初删除了 C++ 标签,因为它看起来像 C,但后来我看到了“新”。伙计,在 C++ 中有更好的方法来做这种事情。
  • @JamesMcLaughlin 确实有 - 为struct employee 重载new 和 delete` 运算符以进行池分配是常见的。
  • 为什么不使用标准库std::list中已经存在的列表。当您需要更多时,只需在后面推送新条目。如果您一次想要多 100 个,只需循环添加 100 个。
  • 您也可以使用std::vector 作为池,使用std::vector::reserve 一次添加100 个条目。如果您真的希望它们也出现在列表中,请在分配它们后将它们添加到 std::list
  • 顺便说一下,您的示例中的循环有问题,它可能应该从i = 0 变为i &lt; 100。就像现在一样,您将不会获得池中的第一个条目,而您将在池外一步获得最后一个条目。更容易查看您是否会使用例如pEmployeeData=&amp;EmployeePool[i];

标签: c++ linked-list heap-memory dynamic-memory-allocation


【解决方案1】:

我强烈建议您不要尝试通过编写自己的链表来重新发明轮子,而是查看包含可供您使用的现成容器类型的 C++ 标准库。 (例如std::vectorstd::list)。

容器类型存在于 C++ 标准库中,用于存储数据/对象的集合。例如,您可以按照以下方式做一些事情

#include <iostream>
#include <vector>
#include <string>

struct Employee
{
    std::string name;
    int id;
};

int main()
{
    std::vector<Employee> my_employees;

    Employee fred = { "Fred", 1 };
    Employee bob = { "Bob", 2 };

    my_employees.push_back( fred );
    my_employees.push_back( bob );


    std::cout << my_employees[0].id << " " << my_employees[0].name << "\n"
              << my_employees[1].id << " " << my_employees[1].name << std::endl;
}

标准容器易于使用和学习(您会发现大量描述如何使用它们的互联网资源 - 您的书也应该告诉您!);如果您是 C++ 新手,那么在尝试创建自己的之前,最好先弄清楚如何使用它们。

【讨论】:

  • 对于非平凡的员工,或者在某个阶段将要变形的员工,std::vector 将更快更安全,(或一些 smart_ptr)。跨度>
【解决方案2】:

您将为您的班级覆盖 newdelete 运算符。

new 必须查看任何现有的池并查看是否有任何空闲对象,如果没有,则需要分配一个池。然后,它会返回从它分配的内存。

delete 需要检查提供的对象被分配到的池中。如果仍然在其中分配了任何对象,则池保留,否则可以将其删除。

另外,由于您使用的是 C++,请考虑使用完整的类(尽管差别很小)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2015-05-26
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多