2

我保留了两个对象shared memory,其中一个是一个类,它是:

class GlobalObj
{
public: 
    unsigned int counter;
    unsigned int label;
    bool isExist;

    Globals(void){}
    ~Globals(void){};
};

另一个是boost::multi_index_container包含该类型对象的 a:

class TestObj
{   
public:
    long id;
    unsigned _int64 track1; 
    unsigned _int64 track2;
    int label;


    MetaData(void){};
    ~MetaData(void){};
};

因此,当我构建共享内存时,我以这种方式计算大小:

// TEST_CONTAINER_SIZE is a constant which is the 
// maximum number of record that multi_index container will keep
size_t containerSize = TEST_CONTAINER_SIZE * sizeof(TestObj);

// create shared memory         
managed_shared_memory segment(create_only,"SharedMemory", containerSize + sizeof(GlobalObj));

因此,当我设置时,TEST_CONTAINER_SIZE = 10000;我希望我可以插入10000 TestObj到共享内存中的 multi_index 容器中。3071th但是当我运行程序时,它会触发一个与item中的共享内存大小相关的异常。

multi_index 容器本身是否有任何开销,或者在计算共享内存的大小时我是否遗漏了任何其他东西?

谢谢。

编辑:

因此,在我当前的实现中,我的 multi_index 容器和分配如下所示:

typedef multi_index_container<
    TestObj, 
        indexed_by<    
            ordered_unique<member<TestObj, long, &TestObj::id> >,
            ordered_non_unique< member<TestObj, unsigned _int64, &TestObj::track1> >
        >, 
        boost::interprocess::managed_shared_memory::allocator<TestObj>::type
> ContainerType;


segment = new managed_shared_memory(open_only, "SharedMemory");

DataContainer = segment->construct<ContainerType>
        ("DataContainer")                      //Container's name in shared memory
        ( ContainerType::ctor_args_list()
        , segment->get_allocator<TestObj>());    

因此,既然我知道我的容器中有多少物品,那么最有效和最稳定的分配方式是什么?

4

2 回答 2

0

这完全取决于实现,您不能假设容器的大小。您可能希望allocators在 multi_index 容器中使用自定义。

于 2014-04-24T11:35:57.613 回答
0

管理共享内存段有很多开销。

你真的应该让分配器弄清楚,或者从段中分配这些对象的连续范围,这样你就可以准确地预测所需的内存量。

在这个答案中,我将一些分配开销与managed_shared_memory

一张图说一千个字:

在此处输入图像描述

如您所见,剩余内存量很大程度上取决于您管理分配的方式。

于 2014-04-24T11:39:40.897 回答