А нужен ли козе баян, а C++ - уборщик мусора? · Заметки

Lex Kravetski пишет:

...в ряде случаев внешний по отношению к коду сборщик мусора имеет гораздо больше возможностей для эффективного освобождения памяти. Например, он может очищать память блоками, даже если она использовалась разными объектами. В С++ без хитрых хаков такое организовать невозможно. delete очищает только то, что для этого объекта выделил new (и то не всегда — ловкими кастами вполне можно обмануть delete). Чтобы освободить память сразу для множества указателей, надо переопределять new через сишные функции.

В C++ можно размещать объекты на стеке, в статическом сегменте и внутри друг друга (предки и поля физически находятся внутри блока памяти содержащего их объекта). Таким образом, затраты на распределение и очистку памяти большого количества объектов (в т.ч. локальных, т.е. наиболее часто конструируемых и разрушаемых) в "плюсах" равну нулю, что по определению уделывает любой сборщик мусора. Даже если речь идёт про кучу: вся иерархия и члены одного объекта в C++ находятся в непрерывном блоке памяти, который распределяется и удаляется всего одним системным вызовом. Поэтому по сравнению с другими языками, у которых поля-объекты технически являются ссылками на отдельно выделенные в куче объекты, у C++ есть врождённое преимущество в эффективности, которое только безграмотный программист не учитывает, используя new-delete для объектов, которые можно было бы создавать другим способом (кстати, этим катастрофически грешат программисты, перешедшие на C++ с Delphi или Java: они все локальные переменные и поля-объекты строят через new, просто потому, что они так привыкли).

·· [Continuing] ··

Кстати, в реалтаймовых приложениях зачастую основной блок можно написать таким образом, чтобы там вообще напрочь отсутствовало создание и разрушение объектов (впрочем, это верно и для других языков). Один из очередных моих споров с отъявленными джавистами насчёт нужности GC очень резко закончился, когда я им объяснил, что в наших типичных на тот момент проектах (VST-плагинах) создания и разрушения объектов вообще нету (только при инициализации и выходе).
Другой любимый джавистами пример: сетевой сервер, который очень быстро обрабатывает пиковую нагрузку очень с большим количеством запросов, а потом GC спокойненько разгребает мусор, когда срочных дел уже нет. На C++ можно, например, в треде-обработчика все нужные объекты сделать полями блоке объекта потока, а после обработки запроса и перед разрушением объектов уйти в пониженный приоритет, и пожалуйста - тот же эффект "спокойной уборки".




Comments:

No Comments for this post yet...

Leave a comment:

Your email address will not be displayed on this site.
Your URL will not be displayed on this site. Comments containing URL's of non-personal pages may be removed.
Confirmation Code:
Human Confirmation Code (Captcha)

HTML tags and "<", ">" symbols are not allowed. Links will not be converted to hyperlinks. Any commercials are removed and reported as abuse.

Archives

                                                                                                                                                                                                                                                                   


© Sergey A. Galin, 1998-2021 sageshome.net/blog/