【问题标题】:How is max size calculated in the function max_size() in std::list?如何在 std::list 中的函数 max_size() 中计算最大大小?
【发布时间】:2011-10-31 02:36:25
【问题描述】:

在 std::list 中,函数 max_size() 中的最大尺寸是如何计算的?现在我意识到这取决于实现,但假设我是制作标准库的人。我将如何确定list 的特定类型T 的最大限制也是可移植的?

【问题讨论】:

  • 不管怎样,GNU 实现将其定义为_M_get_Node_allocator().max_size();,然后返回size_t(-1) / sizeof(_Tp);
  • 不管怎么计算,这个值基本上是一文不值……在达到这个理论极限之前系统会很好的报错。
  • 这对于std::allocator 来说通常是无用的,它通常会尝试分配系统上可能可用的任何内存。特定的池分配器也存在,max_size 将等于池大小。你绝对可以用完这样一个游泳池,这不仅仅是理论上的。

标签: c++ list


【解决方案1】:

它几乎总是 N 的最大值,容器最多可以有 N 个元素。这几乎总是意味着相关平台上无符号整数类型的最大值除以要存储在容器中的元素类型的大小。

【讨论】:

  • 你能指出 C++ ISO 标准的部分,它说它是 unsigned int 类型的最大值吗? C++。 2011 年或 1998 年都可以
  • @AdrianCornish:不,我不能。它是实现定义的。我说“几乎总是”。
  • @Adrian:另外,你对2003过敏吗? :)
  • @AdrianCornish:如果你觉得你有更好的信息,请随意写下你自己的竞争答案,而不是抨击别人。如果你能证明这个数量有一个标准定义的值,我很乐意撤销我的回答。 (而且我看不到 max_size() 定义了 type 与定义 value...)
  • @Adrian:正如现在已经多次声明的那样,那是因为它是实现定义的。 OP 询问实施者在为任何给定实施提出他/她的实施定义数量时会做出哪些决定;我已经告诉 OP 这个数量通常是多少。仅仅因为它是一个实现定义的量而不是在标准中明确定义,并不意味着该量神奇地不存在。
【解决方案2】:

想法是STL列表容器默认使用std::allocator作为分配器对象。并且,根据作为模板参数(类型)传递的类型,std::allocator 的 max_size() 方法将返回一个数字,该数字表示它可以分配的该传递类型的最大对象数。 List 应该为节点分配内存,这就是为什么你应该将节点结构作为模板参数传递:

struct node {
         int data;
         node *next;
         node *prev;
      }
std::allocator<node_struct> A;
std::cout << A.max_size();

,这将打印它可以分配的最大节点数(不是字节数)。

如何实现:

namespace test {
   template <typename T, typename A = std::allocator<T>>
   class list {
   private:
      struct node {
         T data;
         node *next;
         node *prev;
      }
      using node_allocator = typename std::allocator_traits<A>::template rebind_alloc<node>;
      node_allocator allocator;
   //...
   public:
   //...
      void max_size() { return allocator.max_size(); }
   //...
   };
}

希望对您有所帮助!

【讨论】:

    【解决方案3】:

    通常是这样的

    numeric_limits<size_type>::max();
    

    因为这是集合而不是平台施加的唯一限制。集合只对自己负责,因此即使它可以计算出系统的最大内存之类的东西,它仍然只会返回它施加的限制。

    【讨论】:

      【解决方案4】:

      根据标准 - 这是可能的最大容器的大小。该函数也必须具有恒定的复杂度。

      根据当前的 C++ 标准: size_type distance(begin(), end()) 最大可能容器

      【讨论】:

      • 本例中的 begin() 和 end() 是什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多