Почему в Windows есть 5-7 разных процедур выделения памяти?

#windows

#Windows

Вопрос:

Согласно их документации, Windows имеет множество функций выделения памяти.

  • CoTaskMemAlloc
  • GlobalAlloc
  • HeapAlloc
  • LocalAlloc
  • malloc
  • новое
  • VirtualAlloc

Учитывая, что «разные распределители кучи обеспечивают различную функциональность, используя разные механизмы, вы должны освободить память с помощью правильной функции», в чем преимущество этих различных процедур?

Есть ли какая-то историческая причина, по которой список процедур выделения увеличился?

Комментарии:

1. Все они распределяются по-разному. Первоначально это было GlobalAlloc для выделения селекторов и LocalAlloc для выделения внутри селектора. COM имеет свой собственный распределитель для поддержки совместного использования памяти между процессами и поддержки IMallocSpy . VirtualAlloc предназначен для выделения виртуальной памяти и HeapAlloc предназначен для выделения в блоке виртуальной памяти. Последние два даже не являются частью Windows. malloc для C. new для C .

2. HeapAlloc, похоже, рекомендуется использовать вместо GlobalAlloc и LocalAlloc. Я предполагаю, что это было не потому, что последние два были разработаны как нежелательные. Зачем они вообще были созданы?

3. Что касается VirtualAlloc, существуют ли для этого универсальные способы использования? Я бы предположил, что виртуализация памяти — это работа ОС, и я не хочу ею управлять. Если бы я не писал гипервизор или что-то в этом роде, зачем бы мне выделять память таким образом?

4. Был ли VirtualAlloc просто добавлен в список процедур выделения, чтобы быть тщательным?

5. LocalAlloc и GlobalAlloc из 16-разрядной Windows и были единственными доступными функциями выделения. Если бы они не были созданы, не было бы никакого способа выделить память вообще. VirtualAlloc — это 32-разрядная функция выделения низкого уровня.