2014-04-24 133 views
2

我保持在shared memory两个对象,其中之一是一类是:共享存储器尺寸计算C++

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

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

而另外一个是boost::multi_index_container其中认为类型的对象:

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项目中的共享内存大小相关的异常。

是否有任何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>());  

所以,因为我知道有多少项目会出现在我的容器什么是最高效稳定的分配方式呢?

回答

0

管理共享内存段的开销很大。

您应该真的让分配器算出来,从段中分配这些对象的连续范围,以便您可以准确地预测所需的内存量。

在这个答案,我对比了一些分配的开销与managed_shared_memory

一张图片胜过千言万语:

enter image description here

正如你可以看到,内存的剩余量为高度取决于您管理分配的方式。

+0

感谢您的回答。请参阅我的编辑。你能告诉我如何实现flat_map_reserved方式吗? – Vecihi

+0

@Vecihi我认为代码应该在链接的答案。我总是要包含运行代码。只需使用第二个'#if'分支(如代码所示) – sehe

+0

好吧,我会尝试一个并通知。谢谢。 – Vecihi

0

这完全取决于执行,你无法承担任何关于容器的大小。您可能希望将自定义allocators用于multi_index容器。

+0

如果他没有使用boost IPC的自定义分配器,我不明白它如何工作。事实上,那么他不会用完共享内存:) – sehe