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