alloca¶
В Ü существует конструкция для выделения памяти со временем жизни, привязанным к времени жизни блока, где эта конструкция используется.
Называется эта конструкция alloca
и она позволяет выделить блок памяти с размером, определяемым во времени выполнения.
fn Foo( size_type s )
{
alloca i32 arr[ s ]; // Выделится память под "s" элементов типа "i32"
} // В этом месте память освободится
Результат конструкции alloca
- сырой указатель на блок выделенной памяти.
Память при этом никак не инициализируется (конструкторы не вызываются), как не вызываются и деструкторы.
Предполагается, что конструкторы и деструкторы необходимым образом должны быть вызваны программистом позже.
В сыром виде эту конструкцию использовать не рекомендуется, вместо этого желательно использовать какой-либо вспомогательный макрос (например, из стандартной библиотеки), который бы заботился об инициализации/деинициализации объектов в выделенной памяти. Более того, alloca
предназначен в основном для использования с подобными вспомогательными макросами.
Конструкция alloca
выделяет память со стека, если размер выделяемой области меньше некого небольшого порога.
Иначе происходит выделение из кучи.
В обоих случаях компилятор должным образом освобождает память, когда это необходимо.
Выделение памяти из кучи для блоков больших размеров нужно затем, чтобы избежать потенциального переполнения стека, когда выделяемый блок больше размеров области, отведённой под стек, или же когда суммарный размер нескольких выделенных блоков больше размера этой области.
Поскольку потенциально возможно выделение из кучи, alloca
нельзя использовать в окружениях, где куча не доступна (не реализованы функции выделения/освобождения памяти).