2013-11-28 71 views
5

請考慮以下結構:在進程內存中使用boost :: optional是否安全?

struct ThingThatWillGoInSharedMemory { 
    boost::optional<int> opt_value; 
}; 

我使用boost ::進程間創建共享內存區域。我對boost :: optional的理解是它是一個有區別的聯合而不是可空指針。 作爲一個反例,像std :: map和std :: vector這些使用堆的東西需要一個顯式的分配器來在進程間內存中使用它們,但boost :: optional,我確信不會使用堆並且是等價的寫作:

struct ThingThatWillGoInSharedMemory { 
    bool value_initialised; 
    int value; 
} 

所以可以開箱即用的。如果有人確認這一點,我會很高興 - 我沒有看到在boost :: optional文檔中明確提到了進程間案例,只是暗示。

回答

1

你是對的。 boost ::可選包裝值,而不是使用指針間接。這意味着諸如int的普通舊數據對象可以存在於共享內存區域中。一般而言,利用堆的對象不能以這種方式使用。

從升壓::可選文檔:

可選和指針之間的差值必須牢記,特別是因爲關係運算符的語義是不同的:因爲可選的是一個值 - 包裝...

boost ::可選的包裝值,而不是使用指針和間接。 boost :: optional的內存佈局的基本模型或多或少是正確的。實際的實現使用包裝通用對齊的字節緩衝區的聯合來避免初始化T對象。該庫使用&(address-of)運算符來獲取進程地址空間中字節緩衝區的本地映射地址。然後將本地存儲器地址轉換爲類型T的指針或引用。

源代碼可在<boost/optional/optional.hpp>

相關問題