定义最小尺寸的结构

时间:2015-01-10 07:09:23

标签: c++ struct

我想定义一个结构,例如typesizeof(type)不低于某个值。

动机:

我有一个向量std::vector<type>,我将从中删除一些元素。此外,我已将某些元素的索引保存到其他位置,因此我希望将其标记为未使用并在将来重用它。这导致我将下一个可用位置保存为删除位置中的列表。因此,sizeof(type)不应少于sizeof(size_t)type也应正确对齐。

可能的解决方案:

  1. boost::variant<type, size_t>

    从我的角度来看,这有两个问题。如果我use boost::get<type>,性能将显着下降。如果我使用boost::apply_visitor,语法会很奇怪,性能也会因我的个人资料而降低。

  2. union{type t; size_t s;}

    除了两个不足之外,这当然有效。首先,引用type成员的语法会更加混乱。其次,我必须为此联合定义构造函数,复制构造函数等。

  3. type

    延长char[sizeof(size_t) - sizeof(type)]

    这几乎满足了我的要求。但是,这种零长度数组的风险不受c ++标准的支持,并且可能是错误的对齐。

  4. 由于我经常不会type使用size_t,我想确保在需要时可以reinterpret_cast<size_t>使用boost::variant

    完整的

    阅读评论后,我认为我的问题的最佳解决方案应该是type。但我仍然想知道是否有办法结合解决方案2和3的好处,即

    一个。我可以访问reinterpret_cast<size_t>的成员而无需更改。

    湾获得{{1}}有效的保证。

2 个答案:

答案 0 :(得分:3)

您可以通过以下方式减轻对解决方案3的担忧:

struct data
{
  // ...
};

template<class T, bool> class pad_;
template<class T> class pad_<T, true> { char dummy[sizeof(T) - sizeof(data)]; };
template<class T> class pad_<T, false> {};

template<class T> using pad = pad_<T, (sizeof(T) > sizeof(data))>;

class type : public data, pad<size_t>
{
  // ...
};

此代码:

  • 假设为empty base optimization,以便pad
  • 时可以type布局完全优化sizeof(data) >= sizeof(size_t)
  • 没有零长度阵列的风险

答案 1 :(得分:1)

虽然这是一个有趣的问题,但设计本身的问题仍然存在问题。

  1. 在插入新元素时,在生长向量之前首先考虑标记为未使用的项目。这意味着项目的相对顺序是不可预测的。如果这是可以接受的,你可以使用(智能)指针的矢量。

    通常,从中间移除项目时,向量效率低。由于订单无关紧要,因此可以将要删除的元素与最后一个元素交换并弹出最后一个元素。

  2. 所有元素大小相同;使用池分配它们可能比使用系统分配器更快。

    池基本上以大块分配内存,并根据请求分发较小的块。池通常将空闲列表存储在尚未分配的块中以跟踪可用内存(问题中描述的相同的想法)。有一些很好的实现可供使用(来自Boost和其他来源)。

  3. 关于原始设计,枚举向量中的元素很麻烦,因为真实元素与&#34; hole&#34;混合,逻辑将被额外的检查混淆。

    < / LI>

    原设计背后可能有一些卖出的推理;不幸的是@ user1535111没有告诉细节。