Что касается соответствующих языковых стандартов, C предлагает динамическое распределение памяти только через семейство malloc()
, а в С++ наиболее распространенная форма распределения выполняется с помощью ::operator new()
. C-style malloc также доступен на С++, и многие примеры "первого первого распределителя" используют его как функцию распределения основного ядра, но мне любопытно, как современные компиляторы реализуют фактический оператор производства - новый.
Это просто тонкая оболочка вокруг malloc()
, или она реализована принципиально по-другому из-за довольно различного поведения распределения памяти типичной программы на С++ по сравнению с обычной программой на C?
[Edit: Я считаю, что основное различие обычно описывается следующим образом: программа C имеет меньше, больше, долгоживущих ассигнований, тогда как программа на С++ имеет множество небольших, недолгосрочных распределений. Не стесняйтесь звонить, если это ошибочно, но похоже, что это было бы полезно, если учесть это.]
Для компилятора, такого как GCC, было бы просто просто реализовать одну единую реализацию распределения ядра и использовать ее для всех соответствующих языков, поэтому я задаюсь вопросом, существуют ли различия в деталях, которые пытаются оптимизировать полученную производительность распределения на каждом языке.
Обновление: Спасибо за отличные ответы! Похоже, что в GCC это полностью разрешено ptmalloc, и что MSVC также использует malloc
в ядре. Кто-нибудь знает, как реализуется MSVC-malloc?