我想定义一个结构,例如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
成员的语法会更加混乱。其次,我必须为此联合定义构造函数,复制构造函数等。
type
char[sizeof(size_t) - sizeof(type)]
这几乎满足了我的要求。但是,这种零长度数组的风险不受c ++标准的支持,并且可能是错误的对齐。
由于我经常不会type
使用size_t
,我想确保在需要时可以reinterpret_cast<size_t>
使用boost::variant
。
完整的
阅读评论后,我认为我的问题的最佳解决方案应该是type
。但我仍然想知道是否有办法结合解决方案2和3的好处,即
一个。我可以访问reinterpret_cast<size_t>
的成员而无需更改。
湾获得{{1}}有效的保证。
答案 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>
{
// ...
};
此代码:
pad
type
布局完全优化sizeof(data) >= sizeof(size_t)
答案 1 :(得分:1)
虽然这是一个有趣的问题,但设计本身的问题仍然存在问题。
在插入新元素时,在生长向量之前首先考虑标记为未使用的项目。这意味着项目的相对顺序是不可预测的。如果这是可以接受的,你可以使用(智能)指针的矢量。
通常,从中间移除项目时,向量效率低。由于订单无关紧要,因此可以将要删除的元素与最后一个元素交换并弹出最后一个元素。
所有元素大小相同;使用池分配它们可能比使用系统分配器更快。
池基本上以大块分配内存,并根据请求分发较小的块。池通常将空闲列表存储在尚未分配的块中以跟踪可用内存(问题中描述的相同的想法)。有一些很好的实现可供使用(来自Boost和其他来源)。
关于原始设计,枚举向量中的元素很麻烦,因为真实元素与&#34; hole&#34;混合,逻辑将被额外的检查混淆。
< / LI> 醇>原设计背后可能有一些卖出的推理;不幸的是@ user1535111没有告诉细节。