我想定义一个结构,例如type
,这样sizeof(type)
不小于某个值。用最小尺寸定义结构
动机:
我有一个矢量std::vector<type>
,我会从中删除某些元素。另外,我已经将某些元素的索引保存到其他地方,因此我希望将其标记为未使用并在将来重用。这导致我将下一个可用位置保存为已删除位置中的列表。因此,sizeof(type)
应该不小于sizeof(size_t)
和type
也应该正确对齐。
可能的解决方案:
boost::variant<type, size_t>
这有从我的角度来看两个问题。如果我
use boost::get<type>
,性能将显着下降。如果我使用boost::apply_visitor
,则语法会很奇怪,并且根据我的配置文件,性能也会下降。union{type t; size_t s;}
当然这个工程除了两个不足。首先,引用
type
成员的语法会更加混乱。其次,我必须为此联合定义构造函数,复制构造函数等。通过
char[sizeof(size_t) - sizeof(type)]
扩展
type
这几乎满足了我的要求。然而,这个风险是零长度数组,这是C++标准不支持的,并且可能是错误的对齐。
因为我不会用type
作为size_t
的时候,我想只是保证在需要的时候,我可以使用reinterpret_cast<size_t>
。
补语
阅读评论之后,我觉得我的问题的最佳解决方案应该是boost::variant
。但我仍然想知道是否有办法结合解决方案2和3的优点,即:
a。我可以在不更改的情况下访问type
的会员。
b。获得reinterpret_cast<size_t>
工作的保证。
非常漂亮制定问题。 +1。但在我看来,问题的根源在于你保存了索引以备将来使用。我认为你应该考虑一些不涉及这种恶意元素的向量中的一些元素作为向量中的下一个有效索引。 – bolov
@bolov我同意你的意见。我在向量中使用了unique_ptr,并保存了类型*。但我更喜欢直接访问类型。 (它不适合生产使用)事实上,我认为boost :: variant可能是我的最终解决方案,但我期待着更好的解决方案。 –
cqdjyy01234
你为什么想象boost :: variant会带来性能成本? –