_Znwm
и _Znam
- это только искаженные имена для функций
operator new(std::size_t)
и
operator new[](std::size_t)
соответственно.
An (без размещения) Выражение массива new вызывает последнее, в то время как выражение (не размещающее) нового массива, не являющееся массивом, вызывает первое для выделения памяти.
Эти функции могут быть заменены пользователем, но реализация по умолчанию обеспечивается стандартом. библиотека. Реализация по умолчанию версии массива просто вызывает версию без массива, так как C ++ 11 и версия без массива выделяет память переданного размера, выровненного соответствующим образом для всех типов, не имеющих выравнивания, каким-то неуказанным способом, вызывая исключение std::bad_alloc
если распределение завершается неудачно и в противном случае возвращается ненулевой указатель на начало выделенного блока.
Таким образом, он ведет себя подобно std::malloc
, за исключением того, что последний возвращает нулевой указатель в случае сбоя выделения, а не бросить исключение. Не определено, но вероятно, что стандартная реализация operator new
просто использует malloc
для внутреннего распределения.
malloc
не должен вызывать operator new
или operator new[]
, поэтому я не буду Я знаю, почему вы думаете, что это будет переводиться в IR.
Я не думаю, что здесь есть что-то, определяющее LLVM c. Какая функция выделения вызывается, определяется стандартом C ++. Только имена искажаются способом, определяемым реализацией.
Также обратите внимание, что эти вызовы не все , в которые переводятся новые выражения. После вызова operator new
/ operator new[]
новое выражение также будет создавать объекты в памяти, что может потребовать вызова конструктора для хранения значений.