一个vector必须存储两个size吗?

Does a vector have to store the size twice?

本文关键字:两个 size vector 存储 一个      更新时间:2023-10-16

这是一个相当学术性的问题,我意识到它与优化无关,但这只是出于兴趣。

据我所知,当您调用new[size]时,会分配额外的空间来存储已分配数组的大小。这样,当调用delete []时,就知道可以释放多少空间。

我所做的是写下我认为向量将大致实现的方式:

#include <cstddef>
template <class T>
class Vector
{
public:
  struct VectorStorage
  {
    std::size_t size;
    T data[];
  };
  Vector(std::size_t size) : storage(new VectorStorage[size])
  {
    storage->size = size;
  }
  std::size_t size() 
  { 
    return storage->size; 
  }
  ~Vector() 
  { 
    delete[] storage; 
  }
private:
  VectorStorage* storage;
};

据我所知,size被存储了两次。一旦直接在VectorStorage对象中(因为它需要这样size()函数可以工作),但再次以编译器隐藏的方式,因此delete[]可以工作。

似乎size被存储了两次。这种情况是不可避免的吗?还是有办法确保大小只存储一次?

std::vector不分配内存;std::allocator,或者你给vector的任何分配器,是分配内存的。分配器接口给出了要分配/释放的项数,因此不需要实际存储这些项数。

vector通常不存储大小。通常的实现在最后一个元素的末尾和分配的内存的末尾保持一个指针,因为可以在不实际存储元素的情况下reserve空间。但是,没有标准的方法来访问new存储的大小(可能一开始就不存储),因此通常需要一些复制。

是。但这是堆分配器的实现细节,编译器对此一无所知。它几乎肯定与vector的容量不同,因为vector只关心元素的数量,而不是字节的数量。而且堆块往往有额外的开销。

你把size放在了错误的地方——你把它存储在每个元素中(通过一个VectorStorage数组),它还包含一个t的数组(每个VectorStorage实例)。你真的想在数组中有一个数组吗?你也不会在析构函数中清理T数组。