вывод должен быть: 2000000
blockquote>Нет, по трем причинам:
- Вы печатаете две вещи, поэтому вывод не будет одно число.
- Он печатает размер, когда каждая нить добавила 1000000 вещей; вы ничего не знаете о том, сколько другой поток сделал на этом этапе.
- Вы не получаете доступ к размеру синхронизированным образом, поэтому вы обязаны получить не актуальное значение.
Первая версия правильна. Это более просто почти каждым способом. Легче записать, легче читать, легче понять, легче поддержать, и т.д....
Вторая версия может быть быстрее, но с другой стороны она не может. Необходимо было бы показать, что это имело значительное преимущество перед использованием его. В большинстве нетривиальных случаев я предположил бы, что не будет измеримого различия в производительности между двумя.
Иногда во встроенном программировании его полезно постараться не помещать вещи на стек; в этом случае вторая версия была бы правильна.
Используйте первую версию по умолчанию; используйте второе, только если можно привести серьезную причину для того, чтобы сделать так (если причиной является производительность, то у Вас должно быть доказательство, что преимущество является значительным).
Я говорю, что первый более защищен от ошибки. Вы не оказываетесь перед необходимостью не забывать очищать его (это просто выйдет из объема и будет сделано).:-)
Мудрый производительностью нет большой части различия, но необходимо, тем не менее, измерить оба случая и лично убедиться.
Между двумя будет очень мало различия в производительности. Необходимо принять решение на основе удобочитаемости кода и устойчивости.
Я думаю, что первый пример более читаем и более безопасен - что происходит через шесть месяцев, когда Вы добавите условие к циклу, возможно, с продолжением там где-нибудь - во втором примере, это обойдет ясное (), и у Вас будет ошибка.
Если это - вопрос set/map/list
, это не будет иметь никакого значения. Если это - вопрос vector/hash_set/hash_map/string
, второе или будет быстрее или та же скорость. Конечно, это различие в скорости только будет заметным при выполнении очень большого количества операций (10,000 ints, продвинутые в a vector
10,000 раз было приблизительно вдвое более быстрым - 3 секунды и некоторое изменение по сравнению с 7 секундами.).
Если Вы делаете что-то как хранение a struct/class
в Вашей структуре данных вместо указателя на один это различие будет еще больше, потому что на каждом изменяют размер, необходимо скопировать все элементы.
Снова, почти в каждом случае, не будет иметь значения - и в случаях, где это действительно имеет значение, это обнаружится, если Вы оптимизируете, и Вы заботитесь о каждом бите производительности.
Второе может быть немного лучше мудрый временем, но различие будет чрезвычайно минимально - код все еще должен пройти и выпустить каждый из объектов в наборе, независимо от того, воссоздает ли это его или очищает его.
(Мудрый пространством они будут идентичны.)
Вы помещаете свой набор на стек, для этого стоимость выделения является почти нулем!
Как правило существует стоимость выделения памяти, связанная с загружающимися данными в контейнер. Намного лучше постараться не оплачивать ту стоимость много раз путем многократного использования контейнера. Если Вы на самом деле знаете, сколько объектов, или может высказать хорошее предположение, необходимо предварительно выделить пространство в контейнере впереди.
Особенно примечательно при вставке объектов в контейнер потому что можно закончить тем, что оплатили много дополнительных издержек конструкции/разрушения, поскольку контейнер понимает, что это является слишком маленьким, перераспределяет память, и копия создает новые объекты в новую память на основе существующих объектов.
Всегда предварительно выделяйте и повторное использование. Это экономит время и память.
Существует очень мало различия, хотя Ваш второй старается не вызывать конструктора и деструктор многократно. С другой стороны, Ваш первый является одной строкой короче и гарантирует, что контейнер не видим вне объема цикла.
Я думаю, что можно предварительно выделить определенное число элементов для контейнеров STL, таким образом стоя постоянного выделения памяти, если Вы знаете, сколькими элементы будут в контейнере.