C++ STL: Контейнерное Воссоздание или Повторное использование после очистки?

вывод должен быть: 2000000

Нет, по трем причинам:

  1. Вы печатаете две вещи, поэтому вывод не будет одно число.
  2. Он печатает размер, когда каждая нить добавила 1000000 вещей; вы ничего не знаете о том, сколько другой поток сделал на этом этапе.
  3. Вы не получаете доступ к размеру синхронизированным образом, поэтому вы обязаны получить не актуальное значение.
6
задан Chris Jester-Young 19 October 2008 в 23:23
поделиться

9 ответов

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

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

Иногда во встроенном программировании его полезно постараться не помещать вещи на стек; в этом случае вторая версия была бы правильна.

Используйте первую версию по умолчанию; используйте второе, только если можно привести серьезную причину для того, чтобы сделать так (если причиной является производительность, то у Вас должно быть доказательство, что преимущество является значительным).

15
ответ дан 8 December 2019 в 03:28
поделиться

Я говорю, что первый более защищен от ошибки. Вы не оказываетесь перед необходимостью не забывать очищать его (это просто выйдет из объема и будет сделано).:-)

Мудрый производительностью нет большой части различия, но необходимо, тем не менее, измерить оба случая и лично убедиться.

7
ответ дан 8 December 2019 в 03:28
поделиться

Между двумя будет очень мало различия в производительности. Необходимо принять решение на основе удобочитаемости кода и устойчивости.

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

1
ответ дан 8 December 2019 в 03:28
поделиться

Если это - вопрос set/map/list, это не будет иметь никакого значения. Если это - вопрос vector/hash_set/hash_map/string, второе или будет быстрее или та же скорость. Конечно, это различие в скорости только будет заметным при выполнении очень большого количества операций (10,000 ints, продвинутые в a vector 10,000 раз было приблизительно вдвое более быстрым - 3 секунды и некоторое изменение по сравнению с 7 секундами.).

Если Вы делаете что-то как хранение a struct/class в Вашей структуре данных вместо указателя на один это различие будет еще больше, потому что на каждом изменяют размер, необходимо скопировать все элементы.

Снова, почти в каждом случае, не будет иметь значения - и в случаях, где это действительно имеет значение, это обнаружится, если Вы оптимизируете, и Вы заботитесь о каждом бите производительности.

4
ответ дан 8 December 2019 в 03:28
поделиться

Второе может быть немного лучше мудрый временем, но различие будет чрезвычайно минимально - код все еще должен пройти и выпустить каждый из объектов в наборе, независимо от того, воссоздает ли это его или очищает его.

(Мудрый пространством они будут идентичны.)

2
ответ дан 8 December 2019 в 03:28
поделиться

Вы помещаете свой набор на стек, для этого стоимость выделения является почти нулем!

1
ответ дан 8 December 2019 в 03:28
поделиться

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

Особенно примечательно при вставке объектов в контейнер потому что можно закончить тем, что оплатили много дополнительных издержек конструкции/разрушения, поскольку контейнер понимает, что это является слишком маленьким, перераспределяет память, и копия создает новые объекты в новую память на основе существующих объектов.

Всегда предварительно выделяйте и повторное использование. Это экономит время и память.

0
ответ дан 8 December 2019 в 03:28
поделиться

Существует очень мало различия, хотя Ваш второй старается не вызывать конструктора и деструктор многократно. С другой стороны, Ваш первый является одной строкой короче и гарантирует, что контейнер не видим вне объема цикла.

0
ответ дан 8 December 2019 в 03:28
поделиться

Я думаю, что можно предварительно выделить определенное число элементов для контейнеров STL, таким образом стоя постоянного выделения памяти, если Вы знаете, сколькими элементы будут в контейнере.

-1
ответ дан 8 December 2019 в 03:28
поделиться
Другие вопросы по тегам:

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