Большинство операционных систем [нужная ссылка] управляет памятью порциями, обычно называемыми «страницами».Это артефакт базового оборудования.
Давно признано, что библиотека malloc
(и, соответственно, new
) будет удовлетворять запрос пользователя на память, выделяя один или несколько "страниц "памяти из операционной системы, а затем передают эту память пользователю. (*) Последующие запросы, которые могут быть удовлетворены без запроса большего количества страниц из ОС, будут удовлетворены таким образом.
Кровавые подробности варьируются от системы к системе и от распределителя к распределителю.Обычно они пытаются найти баланс между скоростью (выделения / освобождения) и эффективностью (минимального использования памяти).
Также традиционным является то, что приложения имеют определенные требования к памяти (скорость, эффективность).) сделайте malloc
большой кусок памяти за один раз, а затем выполните управление этой памятью самостоятельно.Это добавляет сложность и увеличивает вероятность ошибок (например, память, выделенная через управление памятью приложения, но free()
d, или память malloc()
ed, но освобожденная через управление памятью приложения, или ошибка в самом управлении памятью приложения), но позволяетприложение для управления используемыми алгоритмами.
C ++ делает это проще с помощью allocators , которые эффективно "передают" управление памятью контейнера другому классу, позволяя использовать настроенную, повторно используемую памятьклассы управления.
Итак:
- Да, это возможно.
- Нет, ничто в стандарте не запрещает это.
- Да, этообычно уже сделано «под капотом».
Следствием 3. является, конечно, старый трюизм мера, оптимизация, мера. (Не пытайтесь оптимизироватьустраните проблему, которой у вас нет, и если она у вас есть, убедитесь, что ваша оптимизация действительно улучшила, а не усугубила ситуацию.)
(*)dware, который вводит понятие «страниц», - это то же самое, что защищает отдельные области памяти приложения друг от друга - модуль управления памятью .Чтобы приложения не нарушали эту защиту, только операционная система может изменять распределение памяти.Терминология и архитектура различаются, но обычно существует какой-то «режим супервизора», который доступен только для ядра ОС, поэтому приложение должно запустить ядро, которое затем выполняет выделение и затем возвращает управление приложению.
Это называется «переключение контекста», и с точки зрения процессорного времени это одна из самых дорогих операций, которые там есть.Поэтому с самого начала разработчики библиотек искали способы минимизировать переключение контекста.Вот почему malloc
и new
обычно довольно хорошо оптимизированы для общего использования.