簡體   English   中英

用最小大小定義結構

[英]Define struct with minimum size

我想定義一個結構,例如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. 通過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
  • 沒有零長度數組的風險

盡管這是一個有趣的問題,但設計本身仍存在問題。

  1. 插入新元素時,在增長向量之前,首先考慮標記為未使用的項目。 這意味着項目的相對順序是不可預測的。 如果可以接受的話,您可以使用(智能)指針的向量。

    通常,從中間刪除項目時,向量效率很低。 由於順序無關緊要,因此可以將要刪除的元素與最后一個元素交換,然后彈出最后一個元素。

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

    池基本上按大塊分配內存,並根據請求分配較小的塊。 池通常將空閑列表存儲在尚未分配的塊中,以跟蹤可用內存(問題中所描述的相同思想)。 有一些很好的實現方式可供使用(來自Boost和其他來源)。

  3. 關於原始設計,枚舉向量中的元素比較麻煩,因為實際元素與“空洞”混合在一起,因此邏輯將被其他檢查所混淆。

原始設計背后可能有一些推論。 不幸的是@ user1535111沒有透露詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM