Это довольно академический вопрос, я понимаю, что он не имеет большого значения для оптимизации, но это просто не в интересах.
Из того, что я понимаю, когда вы звоните 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
хранится дважды.Это так и неизбежно, или есть способ гарантировать, что размер сохраняется только один раз?