Являются ли функциональные возможности _Znwm и _Znam одинаковыми в c ++? - PullRequest
0 голосов
/ 22 марта 2020

В последнее время я использую llvm, и я обнаружил, что новые операторы в cpp переводятся в _Znam в IRvm llvm, я знаю, что new в cpp также вызывает функцию _Znwm, и new [] вызов _Znam, в чем же разница между функциональностью этих двух функций? Что если я использую _Znwm для выделения пространства для массива?

Пример

a = new int*[10];

скомпилирован как

%2 = call i8* @_Znam(i64 80) #2

1 Ответ

0 голосов
/ 22 марта 2020

_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[] новое выражение также будет создавать объекты в памяти, что может потребовать вызова конструктора для хранения значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...