2011-08-24 14 views
6

Sé que debería haber un operador de eliminación con el que no estoy interesado en alguna parte. Me pregunto, wow, funcionó. ¿De dónde viene el argumento "tamaño"?¿De dónde viene el `tamaño`?

#include<iostream> 
#include<string> 

class Base { 
public: 
    Base() { } 
    void *operator new(unsigned int size, std::string str) { 
    std::cout << "Logging an allocation of "; 
    std::cout << size; 
    std::cout << " bytes for new object '"; 
    std::cout << str; 
    std::cout << "'"; 
    std::cout << std::endl; 
    return malloc(size); 
    } 
private: 
    int var1; 
    double var2; 
}; 

int main(int argc, char** argv){ 
    Base* b = new ("Base instance 1") Base; 
} 

Este es el resultado:

Registro de una asignación de 16 bytes para el nuevo objeto 'ejemplo de base 1'

+2

Usted está viendo algunos f características avanzadas de C++. Como principiante, deberías enfocarte en cosas más básicas. – user763305

+0

¡Cuidado, el tamaño de un objeto y el número asignado de bytes pueden ser diferentes debido a la alineación, el relleno y otros gastos generales! Especialmente cierto para matrices. No suponga que el objeto se coloca en la dirección que devolvió en su operador nuevo, ¡porque podría no ser así! – Frigo

+0

En realidad desde el estándar 5.3.4/12: "nueva T da como resultado una llamada del operador nuevo (sizeof (T))". Si desea una alineación especial, deberá proporcionarla usted mismo y el objeto se colocará en la dirección devuelta desde la nueva. –

Respuesta

12

Es proporcionado por el compilador en tiempo de compilación. Cuando el compilador ve:

new ("Base instance 1") Base; 

se agregará una llamada a:

Base::operator new(sizeof(Base), "Base instance 1"); 

EDIT: El compilador por supuesto también añadir una llamada a Base::Base()

+0

Eres increíble. ¡Gracias! Increíble. Cambié el código y obtuve un error: el primer parámetro formal para 'operador nuevo' debe ser 'size_t'.Ahora sé un poco más sobre nuevo. Gracias de nuevo. – Mike

0

en int arco de 32 bits es 4 bytes, el doble es 8, pero el doble va a estar alineado con el límite de 8 bytes, de modo que tamaño = 4 + 4 (espacio vacío) + 8 = 16

+0

la pregunta no era cómo el tamaño del tipo llegó a existir, sino sobre el parámetro de tamaño a nuevo, y de dónde se rellenará a partir de – PlasmaHH

Cuestiones relacionadas