Почему некоторые языки, такие как C и C++, не имеют сборку мусора? Я привык к Java, поэтому я не уверен, что преимущества этого не имеют?C и C++ отсутствие сбора мусора
ответ
C#
есть сбор мусора.
Сбор мусора действительно хорош для программистов, но для этого требуется стоимость исполнения. C/C++ - это языки системного программирования и, как таковые, они должны иметь возможность работать на голой поверхности - с минимальным временем выполнения. Это означает, что такие вещи, как сбор мусора, невозможны.
Кроме того, сборка мусора может затруднить объяснение потребления памяти вашей программой. Если вы проектируете, скажем, систему реального времени, отвечающую за поддержание самолета в воздухе, вы не хотите рисковать GC-паузой, вызывающей катастрофический провал.
Отличная точка в системах реального времени, я также об этом говорю в своем ответе – EJoshuaS
Потому что это более эффективно. C
* языки ориентированы на:
- производства, как быстро бинарную программу, насколько это возможно
- еще легко понять, для людей (так ассемблере, а быстрее, не отвечает этому требованию)
Если вы делали автоматическую сборку мусора, это требует времени, и несколько раз программа не должна работать правильно. Программист может принять решение в каждом конкретном случае, если это необходимо или нет.
Спектакль. Обычно существуют два типа управления памятью для языков более высокого уровня. Существует подход garbage collection, и есть reference counting, найденный в системах Apple. Обе из них несут затраты на производительность при трассировке объектов и их отсечении, и это имеет след на нужную память и время процессора.
С C & C++ - это старые языки относительно, они были разработаны в соответствии со встроенными системами и широким спектром устройств со многими ограничениями, поэтому они не могли позволить себе управлять памятью.
При правильном объеме практики и экспозиции не должно быть так сложно управлять приложениями C/C++ относительно хорошо.
BTW, C# имеет сбор мусора. Только C и C++ их нет.
Edit:
Как другие могли бы добавить, в новых стандартах C++, есть shared pointershared_ptr
, который применяется подсчет ссылок подход к управлению памятью.
Неужели у Lisp есть сборка мусора на ранней стадии? – EJoshuaS
Не уверен, я из поколения C# :) –
В дополнение к тому, что другие люди указали на производительность (что совершенно правильно), я также хотел бы отметить, что сборщик мусора is a major problem для систем реального времени из-за непредсказуемости, которую он вводит.
Напомним, что система реального времени, в которой задачи должны соответствовать определенным временным ограничениям, чтобы быть правильными. Например, если вы пишете код для робота, и он не понимает, что он вот-вот ударит по стене вовремя, чтобы остановиться, то ясно, что это не правильный результат. Тот факт, что вы выяснили, что вы собираетесь ударить по стене после, вы уже сделали это, совершенно бесполезно.
От Microsoft documentation,
Чтобы вернуть объекты, сборщик мусора должен остановить все выполняющиеся потоки в приложении. В некоторых ситуациях, например, когда приложение извлекает данные или отображает контент, полная сборка мусора может произойти в критическое время и препятствовать производительности.
Это особенно проблематично, поскольку предсказать, когда сборщик мусора будет запущен, или точно, сколько времени потребуется для его завершения, может быть очень сложно или невозможно предсказать. Это может привести к тому, что задачи будут пропущены.
В статье, которая приведена выше, более подробно описывается влияние производительности сборщика мусора и способы минимизации его воздействия в критических ситуациях.
Для чего на самом деле есть попытки сделать версии C# и Java в режиме реального времени. См., Например, Real Time Java.
Я действительно понимаю, что подавляющее большинство систем не в режиме реального времени, а для тех, которые являются (элементами управления двигателем и т. Д.), Очевидная польза от наличия языка без сбора мусора.
Хорошие заметки, особенно ссылка MSDN. –
Есть целый ряд причин, по крайней мере, по отношению к C:
- C является продуктом в начале 1970-х годов - обратите внимание, что более старые языки, как Fortran, Cobol, Pascal и т.д., не также имеется автоматическая сборка мусора;
- C был получен из языка системного программирования и, как таковой, имеет тенденцию не предлагать много абстракций высокого уровня (указатели и потоки примерно такие же высокие, как и они);
- C и C++ (обычно) скомпилированы в исходные двоичные файлы, запущенные непосредственно над ОС (или даже с открытым металлом) - обратите внимание, что большинство языков, которые выполняют автоматическую сборку мусора, запускаются под виртуальной машиной или интерпретатором;
- Философия C заключается в том, что программист находится в лучшем положении, чтобы знать, когда ресурс должен быть выделен или выпущен, и достаточно квалифицирован, чтобы написать код для его управления;
- Как уже упоминалось, AGC играет в ад с критичным по производительности кодом;
EDIT
Обратите внимание, что автоматическая сборка мусора была вокруг в той или иной форме с 1959 года, когда Маккарти добавил его в Лиспе. Однако на самом деле это не стало чем-то вроде «основных» языков программирования до 1990-х годов, когда появилась Java; В этот момент большинство систем были достаточно быстрыми, и мы были готовы обменять (незначительный) удар производительности на (несколько) более надежный код.
С AGC можно сделать жизнь намного проще в некоторых отношениях, но она также вводит небольшой уровень непредсказуемости в вашем коде. RAII, как обычно практикуется в C++, является хорошим компромиссом между всеми функциями ручного управления памятью и автоматической сборкой мусора. Совершено правильно, это дает вам все преимущества беспроблемного управления ресурсами и предсказуемости.
C# имеет сбор мусора. – juharr
Здесь вы можете прочитать о сборке мусора: https://msdn.microsoft.com/en-us/library/0xy59wtx(v=vs.110).aspx – Girisha
Современный 'C++' обескураживает использование нового.Вместо этого мы используем контейнеры из стандартной библиотеки и интеллектуальных указателей. В результате этого потребность в сборке мусора намного меньше, чем 20 лет назад. – drescherjm