![](/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.