2014-04-24 173 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