簡體   English   中英

std :: end for unique_ptr <T[]>

[英]std::end for unique_ptr<T[]>

我想為唯一指針實現std :: end。 問題是我必須得到N(數組中的元素數)。

1.從模板中推導出推斷類型

template <typename T, size_t N>
T* end(const unique_ptr<T[N]> &arr)
{
    return arr.get() + N;
}

但我得到錯誤錯誤:C2893:無法使用[_Ty = T [N]]專門化函數模板'T * test :: end(const std :: unique_ptr>&)'使用以下模板參數:'T = int' 'N = 0×00'

看起來不可能推斷出N.

2.從分配器獲取N. 分配器必須知道N才能正確執行delete []。 您可以在本文中閱讀此內容 有兩種方法:

  1. 過度分配數組並將n放在左側。

  2. 使用關聯數組,其中p為鍵,n為值。

問題是如何獲得這個大小跨平台/編譯器。

也許有人知道更好的方法或知道如何使這個工作?

如果你有一個運行時大小的數組,你需要知道它的大小而不必手動執行簿記,那么你應該使用std::vector 它將為您管理內存和大小。

std::unique_ptr<T[]>只是原始指針的包裝器。 您無法僅通過指針獲取指針所指向的塊的大小。 你使用std::unique_ptr<T[]>不是T* foo = new T[size]unique_ptr確保當指針超出范圍時調用delete[]

像這樣的東西?

template<class X>
struct sized_unique_buffer;

template<class T, std::size_t N>
struct sized_unique_buffer<T[N]>:
  std::unique_ptr<T[]>
{
  using std::unique_ptr<T[]>::unique_ptr;
  T* begin() const { return this->get(); }
  T* end() const { return *this?begin(*this)+N:nullptr; }
  bool empty() const { return N==0 || !*this; }
};

我們有一個編譯時未執行的固定編譯時長度的承諾。

類似的設計可以用於動態運行時長度。

在一些編譯器,數量T的時候T ,當你調用可以平凡銷毀不存儲new T[N] 系統可以自由地過度分配並為您提供更大的緩沖區(即,為了大分配而舍入到頁邊界,或者通過分配緩沖區的位置隱式存儲緩沖區的大小,以減少開銷和舍入分配),所以分配大小不需要與元素的數量完全匹配。

對於非平凡的被破壞的T ,編譯器必須知道從指針中銷毀多少。 此信息不會暴露給C ++。

您可以手動分配緩沖區和計數,並使用自定義刪除程序(即使是無狀態刪除程序)將其傳遞給unique_ptr 這將允許一種類型

unique_buffer<T[]> ptr;

您可以在適當的運行時間內獲得元素數量。

如果您將長度存儲在刪除器中,則可以以更大的unique_buffer<T[]>為代價,在循環限制(保存緩存未命中)上獲得更多位置。

使用純粹的unique_ptr<T[]>執行此操作是不可能的。

暫無
暫無

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

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