[英]Define struct with minimum size
我想定義一個結構,例如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
char[sizeof(size_t) - sizeof(type)]
這幾乎可以滿足我的要求。 但是,這冒着零長度數組的風險,這是c ++標准不支持的,並且可能對齊錯誤。
由於我不會經常將type
用作size_t
,因此我只想確保在需要時可以使用reinterpret_cast<size_t>
。
補體
閱讀評論后,我認為針對我的問題的最佳解決方案應該是boost::variant
。 但是我仍然想知道是否有辦法結合解決方案2和3的好處,即
一種。 我可以訪問type
成員而無需更改。
b。 獲得保證reinterpret_cast<size_t>
起作用。
您可以使用以下方法減輕對解決方案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>
{
// ...
};
這段代碼:
sizeof(data) >= sizeof(size_t)
時,可以從type
布局中完全優化pad
盡管這是一個有趣的問題,但設計本身仍存在問題。
插入新元素時,在增長向量之前,首先考慮標記為未使用的項目。 這意味着項目的相對順序是不可預測的。 如果可以接受的話,您可以使用(智能)指針的向量。
通常,從中間刪除項目時,向量效率很低。 由於順序無關緊要,因此可以將要刪除的元素與最后一個元素交換,然后彈出最后一個元素。
所有元素的大小相同; 使用池分配它們可能比使用系統分配器更快。
池基本上按大塊分配內存,並根據請求分配較小的塊。 池通常將空閑列表存儲在尚未分配的塊中,以跟蹤可用內存(問題中所描述的相同思想)。 有一些很好的實現方式可供使用(來自Boost和其他來源)。
關於原始設計,枚舉向量中的元素比較麻煩,因為實際元素與“空洞”混合在一起,因此邏輯將被其他檢查所混淆。
原始設計背后可能有一些推論。 不幸的是@ user1535111沒有透露詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.