![](/img/trans.png)
[英]Assign std::vector<std::unique_ptr<T>> to another std::vector<std::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 []。 您可以在本文中閱讀此內容 。 有兩種方法:
過度分配數組並將n放在左側。
使用關聯數組,其中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.