станд.:: векторный резерв () и push_back () быстрее, чем изменяют размеры () и индекс массива, почему?

Переменные, которые не инициализируются явно, будут или не могли бы быть обнулены в Сборке конечных версий.

38
задан Shog9 22 September 2009 в 17:17
поделиться

4 ответа

Инициализирует ли изменение размера вновь выделенный вектор, когда резерв только выделяет, но не создает?

Да.

62
ответ дан 27 November 2019 в 03:35
поделиться

Первый код записывает в out [i] , что сводится к begin () + i (т.е. . дополнение). Второй код использует push_back , который, вероятно, немедленно записывает в известный указатель, эквивалентный end () (то есть без добавления). Вы, вероятно, могли бы сделать первый запуск таким же быстрым, как и второй, используя итераторы, а не целочисленную индексацию.

Edit: также для пояснения некоторых других комментариев: вектор содержит числа с плавающей запятой, и создание числа с плавающей запятой фактически нецелесообразно (точно так же объявление «float f;» не приводит к появлению кода, а только сообщает компилятору, что нужно оставить место для float в стеке). Поэтому я думаю, что любая разница в производительности между resize () и reserve () для вектора с плавающей запятой не связана с конструкцией.

3
ответ дан 27 November 2019 в 03:35
поделиться
out.resize( audioBlock.size() );

Поскольку размер out (= 0) меньше, чем audioBlock.size () , дополнительные элементы создаются и добавляются в конец из . Это создает новые элементы, вызывая их конструктор по умолчанию.

Резервный только выделяет память.

1
ответ дан 27 November 2019 в 03:35
поделиться

Resize ()

Изменяет контейнер так, чтобы он имел ровно n элементов, вставляя элементы в конец или удаляя элементы с конца, если необходимо. Если какие-либо элементы вставлены, они являются копиями t. Если n> a.size () , это выражение эквивалентно a.insert (a.end (), n - size (), t) . Если n , это эквивалентно a.erase (a.begin () + n, a.end ()) .

Reserve ()

Если n меньше или равно capacity () , этот вызов не действует. В противном случае это запрос на выделение дополнительной памяти. Если запрос успешен, то capacity () больше или равно n; в противном случае capacity () не изменяется. В любом случае size () не изменяется.

Память будет перераспределена автоматически, если в вектор вставлено более capacity () - size () элементов. Перераспределение не изменяет size () и не меняет значения каких-либо элементов вектора. Однако он увеличивает capacity ()

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

увеличить capacity ()

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

увеличить capacity ()

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

4
ответ дан 27 November 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: