изменение размеров векторов c ++ без вызова их конструкторов - PullRequest
1 голос
/ 30 апреля 2011

Итак, у меня есть такая ситуация:

std::vector<Coord3D> thevector;

, где Coord3D - это простая структура с тремя числами с плавающей запятой: x, y и z.Конструктор также просто имеет x = 0;у = 0;z = 0;и т.д.

Теперь предположим, что я хочу добавить содержимое другого вектора в вектор.

Можно ли изменить размер вектора в thevector.size () + theothervector.size (),не заставляя c ++ вызывать конструктор Coord3D ()?

Причина в том, что я хочу записать содержимое theothervector.Оказалось, что инициализация содержимого с помощью конструкторов заняла некоторое время после некоторого тестирования производительности.std :: loop Заполнение также занимает довольно много времени.

Так что, да, есть ли способ изменить размеры векторов, обходя конструкторы элементов?Будет ли это включать хитрые хаки?

Ответы [ 4 ]

8 голосов
/ 30 апреля 2011
thevector.insert(thevector.end(), theothervector.begin(), theothervector.end());

Если Coord3D с возможностью побитового копирования, компилятор должен иметь возможность оптимизировать его для того же кода, что и memcpy.

2 голосов
/ 12 августа 2012

std :: vectors имеют распределитель, обычно распределитель по умолчанию.Функция-член allocate construct () вызывает конструктор для каждого элемента от вашего имени.

Чтобы не вызывать конструктор per-element, создайте свой собственный распределитель и убедитесь, что функция-член construct () имеет пустое тело функции (или какая-то другая логика, чтобы решить во время выполнения, вызывать или нет конструктор элемента).

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

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

0 голосов
/ 30 апреля 2011

Можно ли изменить размер вектора в thevector.size () + theothervector.size (), не заставляя c ++ вызывать конструктор Coord3D ()?

Нет, при попытке изменить размер вектора. Когда вы изменяете размер вектора, элементы вектора должны быть скопированы в новое место, и в этом случае, если я не ошибаюсь, необходимо вызвать конструктор копирования класса.

Как уже говорили другие, вы можете позвонить как угодно. Но вектор пустой без элементов.

0 голосов
/ 30 апреля 2011

Вы должны увеличить их capacity, а не size.Для этого используйте reserve().А для получения текущей емкости используйте capcity().

. Этот код объяснит как:

std::vector<Coord3D> thevector;
thevector.reserve(n); //where n is size you want
Coord3D * vector_start = &(thevector[0]);
//do memcpy to vector_start

Но этот код небезопасен и связан с реализацией std::vector.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...