2010-03-17 54 views
3

我正在寫一個簡單的wrappers,用於實現IPC中共享內存(shm)中的環形緩衝區,它是boost :: interprocess的向量容器。假設buf是在shm中創建的RingBuffer的實例。現在,在其中,buf本身分配專用的數據成員來存儲值,例如, m_data。我的問題是:我認爲m_data也應該在共享內存中創建。但這是必要的嗎?有關共享內存中的C++容器類的快速設計問題

如果在shm本身創建的buf會分配標準內存,即使用new會發生什麼情況。這是否分配在調用進程的堆上?我不認爲buf是在那裏分配的,那麼如何將不在進程堆中的對象的私有數據成員分配到那裏。我很困惑。

回答

3

boost::interprocess::vector將分配器類型作爲模板參數。這個分配器需要從共享內存中分配(參見使用示例)。

如果您的課程使用new分配內存,那麼該內存將只能從其分配的進程訪問。這是錯誤的,正是爲什麼boost::interprocess::vector需要共享內存分配程序。

在其構造函數,BUF本身分配一個專用的boost ::進程間::矢量數據成員

這是沒有道理給我。在C++中,您不能在構造函數中「分配」數據成員。數據成員在類體中定義,它們是該類的每個對象的一部分。它們與對象存在於相同的內存中,出於同樣的原因,4字節整數的中間字節與整數相同。

怎麼來的數據成員是私有的對象不是一個進程的堆被分配有

內存分配你如何要求它進行分配。如果您使用new進行分配(並且未被重載),則將其分配到進程內存中。如果您使用共享內存段管理器進行分配(這是我認爲Boost所稱的 - 我自己實際上沒有使用這些API),它將分配到共享內存中。包含調用的類以及存儲指向已分配內存的指針的數據成員與此無關。

+0

謝謝史蒂夫,這清除了我很多的困惑。餘下的問題是:在shm中創建的'buf'類應該使用'boost :: interprocess :: vector'還是'std :: vector'來存儲它的數據?我認爲這應該是增強版,只是想知道這是否正確。 – recipriversexclusion 2010-03-17 04:27:57

+0

是的,它必須是進程間。 'std :: vector'分配內存並存儲指針。默認情況下,它使用'new'分配,如我們所知,這將是錯誤的。但是,即使給'std :: vector'分配了一個從共享內存中分配的分配器,它仍然是錯誤的,因爲共享內存可能不會映射到所有進程中的相同地址範圍,如果它不是那麼指針將無法工作。 'boost :: interprocess :: vector'爲你處理。 – 2010-03-17 04:53:34