Повышение эффективности вектора при добавлении элементов

Я думаю о том, чтобы сделать структуру векторных данных более эффективной.

Предположим, что для некоторого общего типа данных 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 Является ли….

Таким образом, это снижает стоимость копирования всех элементов … если данные большие, это может иметь существенное значение …… !!

Пожалуйста скажите мне, если я на правильном пути …

0

Решение

Я понимаю вашу идею как

Если new возвращает мне адрес, который является смежным с памятью, уже хранящейся MyVector объект, я просто буду использовать его без перераспределения.

Да, это действительно может работать в теории. Однако на практике невозможно получить такой непрерывный адрес, потому что распределитель, скорее всего, будет хранить некоторые внутренние данные в начале блока, который он выделяет (например, его размер, или указатель на следующий блок, или что-то еще).

Точные детали зависят от распределителя, используемого вашей стандартной библиотекой (и даже ОС), но вот пример типичного поведения. Ты звонишь new T где sizeof(T) это 16 (например). operator new звонки malloc внутренне, которая вызывает функцию выделения вашей ОС. Эта функция выделяет 20 байтов памяти по адресу X, Он хранит «16» в первых 4 байтах в Xи возвращает адрес X + 4 в mallocкоторый в свою очередь возвращает его operator new и это к вашему приложению. Так что вы никогда не получите непрерывную память.

2

Другие решения


По вопросам рекламы [email protected]