c++ memory-management operator-overloading new-operator

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; }

Ejemplo en vivo

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); // ~~~