繁体   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