Я думаю о том, чтобы сделать структуру векторных данных более эффективной.
Предположим, что для некоторого общего типа данных T … затем при добавлении нового элемента в вектор текущий std :: vector делает перераспределение целого нового фрагмента памяти из n + 1 элементов.
Что я хочу сделать…
Я написал небольшую программу:
#include<iostream>
using namespace std;
int main ()
{
int *i,*j;
i=new int;
cout<<i;
delete i;
j=new int ;
cout<<j;
delete j;
return 0;
}
Обе ячейки памяти были одинаковыми …
Теперь я думаю, что сначала я выделю память для универсального типа данных следующим образом:
T *temp=new T;
Теперь сравните адрес памяти temp с адресом последнего элемента вектора …. Если они отличаются на sizeof (T)
тогда я сам добавлю новый элемент …. остальное сделай так std::vector
Является ли….
Таким образом, это снижает стоимость копирования всех элементов … если данные большие, это может иметь существенное значение …… !!
Пожалуйста скажите мне, если я на правильном пути …
Я понимаю вашу идею как
Если
new
возвращает мне адрес, который является смежным с памятью, уже хранящейсяMyVector
объект, я просто буду использовать его без перераспределения.
Да, это действительно может работать в теории. Однако на практике невозможно получить такой непрерывный адрес, потому что распределитель, скорее всего, будет хранить некоторые внутренние данные в начале блока, который он выделяет (например, его размер, или указатель на следующий блок, или что-то еще).
Точные детали зависят от распределителя, используемого вашей стандартной библиотекой (и даже ОС), но вот пример типичного поведения. Ты звонишь new T
где sizeof(T)
это 16 (например). operator new
звонки malloc
внутренне, которая вызывает функцию выделения вашей ОС. Эта функция выделяет 20 байтов памяти по адресу X
, Он хранит «16» в первых 4 байтах в X
и возвращает адрес X + 4
в malloc
который в свою очередь возвращает его operator new
и это к вашему приложению. Так что вы никогда не получите непрерывную память.