SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore);
Что означает здесь оператор new
?
Какое значение числа 3
после оператора new
?
SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore);
Что означает здесь оператор new
?
Какое значение числа 3
после оператора new
?
Этот код исходит из LLVM codebase.
Там в пользовательском operator new
в области, и он используется для размещения- new инициализировать объекты (cfr. синтаксис размещения)
void *User::operator new(size_t Size, unsigned Us) {
return allocateFixedOperandUser(Size, Us, 0);
}
Вот пример игрушки:
class SelectInst
{
public:
int x;
};
void *operator new(size_t Size, unsigned Us) {
^^^^^^^^^^^ 3 is passed here
^^^^^^^^^^^ allocation size requested
return ... // Allocates enough space for Size and for Us uses
}
SelectInst *Create() {
return new(3) SelectInst();
}
int main()
{
auto ptr = Create();
return 0;
}
В частности, этот код используется для настройки выделенного пространства для размещения дополнительных данных.
Предположим, что SelectInst
предоставляет пользовательский оператор размещения new, который принимает int
как определяемый пользователем аргумент; синтаксис вызова означает использование этого места размещения operator new
для размещения памяти. например.
class SelectInst {
public:
static void* operator new (std::size_t count, int args) {
// ~~~~~~~~
...
}
};
SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore);
// ~~~
Вероятно, у вас есть пользовательский оператор new в SelectInst
или в глобальной области (аналогично размещению нового):
struct SelectInst
{
SelectInst(/*...*/);
// ...
static void* operator new(std::size_t sz, int custom);
static void operator delete(void* ptr, int custom); // new counter part
};
или
void* operator new(std::size_t sz, int custom);
void operator delete(void* ptr, int custom); // new counter part
См. последнюю часть operator_new
В doc говорится, что это объем памяти, который требуется запросить в байтах. (Если он не был перегружен) Здесь это запрос 3 * 8 = 24 бит для хранения объекта в памяти. Подумайте об этом в каком-то остатке malloc.