Векторы с фиксированными размерами и значениями (C ++) - PullRequest
1 голос
/ 11 октября 2010

Я хотел бы знать лучшее решение с точки зрения производительности для хранения векторов / массивов данных (целых или двойных), размер которых недоступен во время компиляции (это зависит от ввода от пользователя), но после инициализацииони никогда не изменят ни свои размеры, ни свои значения.Другими словами, мне было интересно, если я использую что-то отличное от вектора, я могу улучшить эффективность, так как я уверен, что размеры и содержание моего вектора никогда не изменятся после инициализации.Спасибо Альберто

Ответы [ 6 ]

5 голосов
/ 11 октября 2010

Несмотря на подозрения, намекаемые в этом вопросе, я все равно попытался бы использовать std::vector (пока не доказано обратное) и вызывать функцию-член reserve(), чтобы выделить место для всех элементов, как только я узнаю измерение от пользователявход.Вызов reserve() заранее предотвращает повторное выделение памяти и копирование элементов.

2 голосов
/ 11 октября 2010

Что ж, если вы не измените размер вектора, у вас не будет накладных расходов при переопределении.Так что вектор по-прежнему хороший выбор.Если данные не изменятся, вы можете использовать константный вектор

1 голос
/ 11 октября 2010

Если размер и содержимое действительно никогда не меняются после инициализации, используйте const vector. Если содержимое вообще интересно, это означает, что вам придется использовать либо конструктор копирования, либо конструктор, который принимает пару итераторов.

Маловероятно, что многое будет оптимизировано, но стоит попробовать [*]. Это заставляет ваш код быть константно-корректным, то есть то, что вы не только не должны изменять вектор, ваш код должен составлять особый вид proof для компилятора, который (исключая неразумное приведение) Вы не изменяете вектор.

Это дополнительная работа, если ваш код уже не является константно-корректным, но по мере продвижения компилятор скажет вам, что нужно изменить.

[*] Под этим, как я полагаю, я имею в виду, что в качестве общей практики стоит использовать const, где это возможно. Однако причины этого не имеют ничего общего с производительностью. Если вы просто хотите ускорить выполнение определенной программы, есть более эффективное использование времени разработчика, чем перестройка кода, который не является константно-корректным, чтобы быть константно-корректным. Но если предположить, что это скомпилировано, то не нужно вносить изменения.

1 голос
/ 11 октября 2010

std::vector в порядке. Если вы попытаетесь сделать математику с числами там std::valarray может быть хорошим выбором. Он также может быть изменен и изменен, но пока вы его не используете, реализация не должна производить никаких накладных расходов.

0 голосов
/ 11 октября 2010

Ваш альтернативный вариант - boost :: shared_array.Они также подсчитываются по ссылкам, поэтому вы можете копировать shared_array без копирования данных.

shared_array ограничен: вы не можете получить из него размер или защитить свои данные, передав на него shared_array.

Так что для этого вам нужно написать обертку, которая может сделать оба из них.Если вы собираетесь написать оболочку в любом случае, вы можете просто обернуть shared_ptr>, но это означает больше выделений и больше косвенности, поэтому shared_array может быть вашим другом.

shared_array не является частью tr1.

Чтобы использовать shared_array, вы выделяете данные «старым» способом, т. Е. С новым T [N], когда вам нужны данные, но shared_array защищает их время жизни, поэтому вам не нужно беспокоиться об их удалении (пока выне делайте круговых ссылок).

0 голосов
/ 11 октября 2010

Используйте их в списках целых / двойных, пример показан здесь .

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