Есть ли какая-либо большая разница в распределении, освобождении и времени доступа между std::vector<>
и new[]
, когда оба фиксированы и одинаковой длины?C++ std :: vector <> vs new [] performance
ответ
В зависимости от типа и того, как вы его называете. std::vector<int> v(1000000);
должен обнулить миллион ints, тогда как new int[1000000];
этого не делает, поэтому я бы ожидал разницы в скорости. Это одно место в std::vector
, где вы можете оплатить нос за то, что вы не используете, если по какой-то причине вам не нужны начальные значения элементов.
Если вы сравните std::vector<int> v(1000000);
с new int[1000000]();
, то сомневаюсь, что вы увидите большую разницу. Существенный вопрос заключается в том, имеет ли один из них более оптимизированный цикл, задающий нули, чем другой. Если это так, то реализация другой пропустила трюк (или, более конкретно, оптимизатор).
Но 'v (N)' и 'new T [N]' не сопоставимы. Вам нужно сохранить память и объекты отдельно. Таким образом, реальное сравнение с 'std :: vector
@KerrekSB Я согласен с тобой, но можно утверждать и наоборот: 'T * t = new T [N]' позволяет вам сказать 't [n] = 42;', тогда как символ 'vector.reserve' не делает. – juanchopanza
@juanchopanza: Нет, но 't [n]' предполагает, что у вас уже есть целый ряд объектов. Я имею в виду, да, у вас может быть какой-то странный «случайный доступ к неинициализированному хранилищу», но я считаю, что большинство реальных алгоритмов реального мира будут либо требовать разумного, существующего диапазона, либо иначе собирать коллекцию последовательно каким-то образом. Если вам действительно нужно, вы можете создать неинициализированный интерфейс с произвольным доступом. –
new
это плохо, потому что это нарушает идиому единой ответственности, предположив два respon Сиби литий связи: Распределение памяти и строительный объект. Сложность - враг здравомыслия, и вы сражаетесь с сложностью, разделяя проблемы и изолируя обязанности.
Стандартные библиотечные контейнеры позволяют делать именно это, и думают только о объектах. Кроме того, std::vector
addionally позволяет вам думать о хранении, но отдельно, через интерфейсы reserve
/capacity
.
Так ради сохранения ясного ума о вашей логике программы, вы должны всегда предпочитаете контейнер, такие как std::vector
:
std::vector<Foo> v;
// make some storage available
v.reserve(100);
// work with objects - no allocation is required
v.push_back(x);
v.push_back(f(1, 2));
v.emplace_back(true, 'a', 10);
В каком смысле вы используете здесь термин * object *? (Я немного смущен.) – dyp
@ DyP: Я думаю, в смысле 3.8? –
«Стандартные библиотечные контейнеры позволяют вам делать именно это и думать только о * областях хранения *. Кроме того,' std :: vector' addionally позволяет вам думать о хранилище, но отдельно, используя «резервную// емкость» «интерфейсы». Просто поиск + замена не работает для меня :(- по крайней мере, это звучит запутанно – dyp
- 1. std :: vector <std :: vector <T>> vs std :: vector <T*>
- 2. [performance] --- string :: operator + = vs. vector <char> push_back
- 3. iterate std :: vector <std :: vector <char>>?
- 4. Vector vs Array Performance
- 5. Производительность std :: vector <Test> vs std :: vector <Test*>
- 6. Как вернуть std :: vector <std :: vector <int>> от C++ до C++/CLI?
- 7. vector <A> vs vector <A*> vs vector <shared_ptr <A>> in C++
- 8. std :: vector <std::string> crash
- 9. C++ std: vector < T* const>
- 10. Распечатайте std :: vector <std :: wstring>
- 11. C++ литье std :: vector <Derived> * to std :: vector <Base> ...?
- 12. Как написать хэш-функцию для std :: vector <std :: vector <bool>>
- 13. Как перебирать boost: вариант <std :: vector <int>, std :: vector <String>>?
- 14. C++ loop std :: vector <std :: map <std :: string, std :: string>>
- 15. C++ Array vs Vector performance test explain
- 16. vector <std::pair> Vs. 2 X vector <T>
- 17. Как преобразовать void * в std :: vector <std :: vector <std::string>> *?
- 18. Эффективный разбор данных std :: stringstream в std :: vector <std :: vector <double>>
- 19. C++ Std queue and vector performance
- 20. C++ std :: vector performance [reference required]
- 21. Как связать массив JavaScript (оборванный) и std :: vector <std :: vector <T>> объект?
- 22. Vector. <> Vs array
- 23. C++ std :: vector <std::string> iterator segfaults
- 24. преобразование из 'std :: vector <AdjacencyData> (*)()' в нескалярный тип 'std :: vector <AdjacencyData>' запрошен
- 25. convert <vector><string> TO <vector><int> C++, Win32
- 26. Инициализировать std :: vector <std :: vector <int>> with boost :: assign :: list_of
- 27. std :: map <int, int> vs. vector
- 28. Неизвестное преобразование для аргумента 1 из 'std :: vector <std :: basic_string <char>> *' to 'const std :: vector <std :: basic_string <char>> &'
- 29. std :: sort on std :: vector <std::string>
- 30. Как сравнить и назначить между std :: vector <T> и std :: vector <std :: reference_wrapper <T>>?
Используйте профайлер. –
Не должно быть. '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – Shahbaz
Профилируйте его и посмотрите, но я ожидаю, что не будет никакой разницы. – Angew