gpt4 book ai didi

c++ - 在进程间内存中使用 boost::optional 是否安全?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:41 24 4
gpt4 key购买 nike

请考虑以下结构:

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

我正在使用 boost::interprocess 来创建共享内存区域。我对 boost::optional 的理解是它是一个有区别的 union ,而不是一个可为空的指针。作为一个反例,像 std::map 和 std::vector 这样使用堆的东西需要一个显式分配器才能在进程间内存中使用它们,但是 boost::optional,我相当确定不使用堆并且等同于写作:

struct ThingThatWillGoInSharedMemory {
bool value_initialised;
int value;
}

所以它可以开箱即用。如果有人证实这一点,我会很高兴——我没有看到 boost::optional 文档中明确提到进程间情况,只是暗示。

最佳答案

你是对的。 boost::optional 包装值,而不是使用指针间接寻址。这意味着普通的旧数据对象(例如 int)可以存在于共享内存区域中。一般来说,利用堆的对象不能以这种方式使用。

来自 boost::optional 文档:

The difference between an optional and a pointer must be kept in mind, particularly because the semantics of relational operators are different: since optional is a value-wrapper...

boost::optional 包装值,而不是使用指针和间接寻址。您的 boost::optional 内存布局基本模型或多或少是正确的。实际实现使用 union 包装通用对齐字节缓冲区以避免必须初始化 T 对象。该库使用 &(寻址)运算符来获取进程地址空间中字节缓冲区的本地映射地址。然后将此本地内存地址转换为类型 T 的指针或引用。

源代码可以在 <boost/optional/optional.hpp> 找到

关于c++ - 在进程间内存中使用 boost::optional 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20271300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com