#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-разрядная функция выделения низкого уровня.