定义最小尺寸的结构

cqd*_*234 8 c++ struct

我想定义一个结构,例如type,这个sizeof(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. 扩展typechar[sizeof(size_t) - sizeof(type)]

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

因为我不会用typesize_t时候,我想只是确保我可以用reinterpret_cast<size_t>在需要的时候.

补语

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

一个.我可以type无需更改即可访问成员.

湾 获得有效的保证reinterpret_cast<size_t>.

man*_*lio 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>
{
  // ...
};
Run Code Online (Sandbox Code Playgroud)

这段代码:

  • 假设空基优化,以便pad可以从type布局中完全优化sizeof(data) >= sizeof(size_t)
  • 没有零长度数组的风险