【问题标题】:How can I use boost::interprocess::private_node_allocator on a recursive datastructure?如何在递归数据结构上使用 boost::interprocess::private_node_allocator?
【发布时间】:2018-09-06 08:28:31
【问题描述】:

我有一个想要存储在共享内存中的递归数据结构。到目前为止,我已经得到了这个(简化):

using namespace boost::interprocess;
typedef allocator<wchar_t, 
managed_shared_memory::segment_manager>TCharAllocator;
typedef basic_string<wchar_t, std::char_traits<wchar_t>, TCharAllocator> MyShmString;


class Node;
template<>
struct sizeof_value<Node>
{
    static const std::size_t value = *NodeSize*; <---??
};


typedef private_node_allocator<Node, managed_shared_memory::segment_manager> TNodeAllocator;

class Node
{
  private:
    MyShmString _value;
    vector<Node, TNodeAllocator> _children;
};

如果您为 Nodesize 填写一个数字,它会编译并运行。您可以通过编译和打印 sizeof(Node) 来获得此数字。这不是很健壮。我尝试使用返回节点大小的前向声明的 constexpr 函数,但这不能编译(在 MSVC 上)。 有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: boost shared-memory recursive-datastructures


    【解决方案1】:

    如果我理解正确的话,唯一复杂的来源是声明需要不完整类型的数据结构。

    如果boost::interprocess::sizeof_value&lt;&gt; 专业化有效,那就足够了。¹

    在健壮性方面,很容易在Node的定义完成后添加static_assert,以确保实际值与编译器报告的大小匹配:

    static_assert(boost::interprocess::sizeof_value<Node>::value == sizeof(Node), "sizeof mismatch");
    

    ¹我有一种预感,没有它也可以完成,但我现在不能花时间让你的代码自包含来检查

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 2021-04-17
      • 1970-01-01
      相关资源
      最近更新 更多