2013-11-28 72 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>

相关问题