在进程内存中使用boost :: optional是否安全?
请考虑以下结构:
struct ThingThatWillGoInSharedMemory {
boost::optional<int> opt_value;
};
我使用boost :: interprocess来创建共享内存区域。 我对boost :: optional的理解是它是一个有区别的联合而不是可空指针。 作为一个例子,像std :: map和std :: vector这些使用堆的东西需要一个显式的分配器来在进程间内存中使用它们,但是boost :: optional,我相当肯定不会使用堆并且相当于写作:
struct ThingThatWillGoInSharedMemory {
bool value_initialised;
int value;
}
所以它可以用于开箱即用。 如果有人确认这一点,我会很高兴 - 我没有看到在boost :: optional文档中明确提到了进程间案例,只是暗示。
你是对的。 boost ::可选包装值,而不是使用指针间接。 这意味着诸如int的普通旧数据对象可以存在于共享内存区域中。 一般而言,利用堆的对象不能以这种方式使用。
来自boost :: optional文档:
必须记住可选和指针之间的区别,特别是因为关系运算符的语义不同:因为可选是值包装...
boost ::可选的包装值,而不是使用指针和间接。 boost :: optional的内存布局的基本模型或多或少是正确的。 实际的实现使用包装通用对齐的字节缓冲区的联合来避免初始化T对象。 该库使用&(address-of)运算符来获取进程地址空间中的字节缓冲区的本地映射地址。 这个本地存储器地址然后被转换为类型T的指针或引用。
源代码可以在<boost / optional / optional.hpp>找到
链接地址: http://www.djcxy.com/p/50971.html上一篇: Is it safe to use boost::optional in interprocess memory?