operator new benutzt malloc???



  • *** schrieb:

    wo wird denn oben ein Ctor aufgerufen?

    Warum sollte dort ein Ctor aufgerufen werden?

    man beachte: operator new != new



  • man beachte ich habe das hier durch den debugger gejagt und den obringen code bekommen:

    int *x = new int;
    

    wieso wird denn da dieser operator new aufgerufen und nicht new aus C++? bzw. gibt es überhautp new aus C++ oder ist das nur so eine neuwertige malloc verklatschung



  • Welchen Ctor willst du denn für int aufrufen?

    Es gibt keinen Ctor für int und eine Initialisierung findet auch nicht statt.



  • wenn ich schreibe:

    CMyClass *x = new CMyClass;
    

    komm ich zur selben funktion!



  • *** schrieb:

    wenn ich schreibe:

    CMyClass *x = new CMyClass;
    

    komm ich zur selben funktion!

    Und? new wird sich den Speicher über operator new besorgen...



  • aha... also benutzt dieses new was verwendet wird malloc! und es ist nicht wie immer groß rumgeworfen ein eigenständiger befehl!



  • new benutzt malloc, fertig... Der Unterschied ist, dass eben der Constructor aufgerufen wird.



  • *** schrieb:

    aha... also benutzt dieses new was verwendet wird malloc! und es ist nicht wie immer groß rumgeworfen ein eigenständiger befehl!

    Eine naive Implementation von new wäre:

    template<typename T>
    T* new(size_t size)
    {
      T* p=static_cast<T*>(operator new(size * sizeof(T));
      for(size_t i=0; i<size; ++i)
      {
        new(p+i)(T()); //placement new mit standard ctor
      }
      return p;
    }
    

    new besorgt speicher (zB über operator new, malloc, calloc, realloc, oder sonst irgendwie) und es ruft die passenden Ctors auf.



  • *** schrieb:

    aha... also benutzt dieses new was verwendet wird malloc! und es ist nicht wie immer groß rumgeworfen ein eigenständiger befehl!

    new ist kein Befehl der rumgeworfen wird sondern ein Operator der Sprache C++.
    Die globale Funktion operator new kann, muss aber keinesfalls, malloc verwenden. Das ist dem Implementierer überlassen. Desweiteren kann man als Programmierer die Funktion operator new überladen und damit Einfluss auf das Verhalten des new-Operators ausüben.

    Shade Of Mine schrieb:

    new besorgt speicher (zB über operator new, malloc, calloc, realloc, oder sonst irgendwie) und es ruft die passenden Ctors auf.

    new ruft *garanetiert* eine Funktion operator new auf. Entweder die globale, oder aber, falls es sich um die dynamsiche Erstellung eines udts handelt und dieser den op new überlädt, eine statische operator new-Funktion einer Klasse.

    Die operator new-Funktion kann intern natürlich malloc oder gibMirFettSpeicherMama aufrufen. Der new-Operator kann aber nicht direkt malloc aufrufen.



  • Ich hatte schon mit Compilern zu tun, bei denen new deutlich schneller war, als malloc+placement new. (Anmerkung: die Objekte waren nicht besonders groß)



  • Helium schrieb:

    Ich hatte schon mit Compilern zu tun, bei denen new deutlich schneller war, als malloc+placement new. (Anmerkung: die Objekte waren nicht besonders groß)

    Natürlich. Ich würde new ja auch nicht so implementieren - aber zum vorstellen der Vorgänge ist es so ganz praktisch, denke ich.


Anmelden zum Antworten