c++ - ¿Qué significa "nuevo(3)"?
memory-management operator-overloading (4)
SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore);
¿Cuál es el significado del new
operador aquí?
¿Cuál es el significado del número 3
después del new
operador?
En el documento , dice que esta es la cantidad de memoria para solicitar en bytes. (Si no estaba sobrecargado) Aquí está esta es una solicitud de 3 * 8 = 24 bits para almacenar el objeto en la memoria. Piensa en esto en algún tipo de remanente de malloc.
Este código proviene de la base de código de LLVM . Hay un operator new
personalizado operator new
en el alcance y se está utilizando para la ubicación: inicialización nueva de los objetos ( sintaxis de la ubicación del fabricante )
void *User::operator new(size_t Size, unsigned Us) {
return allocateFixedOperandUser(Size, Us, 0);
}
Aquí hay un ejemplo de juguete:
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;
}
Específicamente, ese código se usa para ajustar el espacio asignado para que se ajuste a datos adicionales.
Probablemente tenga un operador personalizado nuevo en SelectInst
o en alcance global (de forma similar a la ubicación nueva ):
struct SelectInst
{
SelectInst(/*...*/);
// ...
static void* operator new(std::size_t sz, int custom);
static void operator delete(void* ptr, int custom); // new counter part
};
o
void* operator new(std::size_t sz, int custom);
void operator delete(void* ptr, int custom); // new counter part
Ver la última parte de operator_new
Supongamos que SelectInst
proporciona un operador de ubicación definido por el usuario new , que toma un int
como argumento definido por el usuario; la sintaxis de invocación significa usar ese operator new
ubicación definido por el usuario operator new
para la asignación de memoria. p.ej
class SelectInst {
public:
static void* operator new (std::size_t count, int args) {
// ~~~~~~~~
...
}
};
SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore);
// ~~~