Moin, ich habe hier ( https://www.geeksforgeeks.org/malloc-vs-new/ ) gelesen, dass bei Malloc auf dem Heap gespeichert wird. Sprich also auf dem RAM. Bei new wird auf den "free store" gespeichert. Wo liegt dieser dann? Gruß Kadse
Kadse schrieb: > Bei new wird auf den "free store" gespeichert. Wo liegt dieser dann? Druckfehler. Beides landet auf dem Heap, irgendwo im Innern von new werkelt unter der Haube auch ein malloc()
Malloc und New sind eigentlich daselbe. Nur ist bei New ein Typ implizit, waehrend bei Malloc nach Byte Groessen alloziert wird. Bedeutet, Malloc ist einen Level tiefer wie New.
Bonzo N. schrieb: > Malloc und New sind eigentlich daselbe. Na ja, new ruft halt, nach dem malloc der Klassenstruktur, sämtliche Konstruktoren auf (und delete vor dem free sämtliche Destruktoren).
Bonzo N. schrieb: > Malloc und New sind eigentlich daselbe. Nur ist bei New ein Typ > implizit, waehrend bei Malloc nach Byte Groessen alloziert wird. Wenn man das Frontend von new betrachtet. Das "Backend" von new kann man selbt implementieren, in dem man operator new überlädt:
1 | void* operator new (size_t); |
2 | void* operator new[] (size_t); |
Dies geht auch innerhalb einer Klasse, so dass klassenlokal spezielle Aktionen erfolgen können (das static ist implizit).
1 | class A |
2 | {
|
3 | static void* operator new (size_t s) |
4 | {
|
5 | // Do some magic
|
6 | return ::operator new (s); |
7 | }
|
8 | };
|
Und für delete:
1 | void operator delete (void*); |
2 | void operator delete[] (void*); |
:
Bearbeitet durch User
Es ist zwar gängige Praxis, aber new muss nicht zwingend auf malloc aufbauen, weswegen sich beide auch nicht zwingend aus demselben Memory-Pool bedienen müssen. Die explizite Unterscheidung dieser Pools in "Heap" und "Free Store" scheint auf Herb Sutter zurückzugehen: http://www.gotw.ca/gotw/009.htm Um die eigentliche Frage zu beantworten: Physikalisch liegen natürlich beide (wie auch Stack und Global/Static) im RAM.
Yalu X. schrieb: > Um die eigentliche Frage zu beantworten: Physikalisch liegen natürlich > beide (wie auch Stack und Global/Static) im RAM. Naja, also um genau zu sein, kann man das im Linkerscript einstellen.
Oh voreilig veröffentlicht. Mir viel ein, dass nicht das Linkerscript allein verantwortlich ist, sondern die Implementierung von new daran natürlich einen noch größeren Anteil hat. Und auch das Betriebssystem kann noch am wo herum pfuschen. Ebenso, wie die Hardware selbst. Durchaus denkbar ist, dass der Heap deines Programms den Cache des Prozessors niemals verlässt.
"free store" ist eine Bezeichnung, die im C++-Standard verwendet wird für den Bereich, der für new verwendet wird. "heap" ist weder in C, noch in C++ ein offizieller Begriff für einen Speicherbereich. Diese Bezeichnung kommt eher aus den Implementierungen der Sprache. Der Bereich für malloc() hat in C keinen speziellen Namen, soweit ich weiß. Das Wort "heap" kommt im C-Standard nicht vor. In der Praxis hängt es vom Compiler ab.
nfet schrieb: > Oh voreilig veröffentlicht. > Mir viel ein, dass nicht das Linkerscript allein verantwortlich ist, > sondern die Implementierung von new daran natürlich einen noch größeren > Anteil hat. > Und auch das Betriebssystem kann noch am wo herum pfuschen. Ebenso, wie > die Hardware selbst. Durchaus denkbar ist, dass der Heap deines > Programms den Cache des Prozessors niemals verlässt. Ach wie schrecklich... Auch malloc und der Stack sind genau so betroffen, das ist also keine Auszeichnung speziell für new.
nfet schrieb: > Physikalisch liegen natürlich >> beide (wie auch Stack und Global/Static) im RAM. > > Naja, also um genau zu sein, kann man das im Linkerscript einstellen. Welchen Sinn sollte es denn haben, mit new reservierten Speicher im ROM anzusiedeln? Georg
georg schrieb: > Welchen Sinn sollte es denn haben, mit new reservierten Speicher im ROM > anzusiedeln? Keinen. Trotzdem kann man im Linkerskript einstellen, wo dieser Speicherbereich liegen soll.
Rolf M. schrieb: > georg schrieb: >> Welchen Sinn sollte es denn haben, mit new reservierten Speicher im ROM >> anzusiedeln? > > Keinen. Trotzdem kann man im Linkerskript einstellen, wo dieser > Speicherbereich liegen soll. Oder wie mein Kollege immer gerne sagt : Kannste so machen, aber dann wird's halt Kacke.
Beitrag #5899852 wurde von einem Moderator gelöscht.
Ach Leute, wieso versteift ihr euch so auf die Idee, den Speicherbereich für malloc in den ROM zu legen, nur um dann zu postulieren, dass das unsinnig ist. Das ist sicherlich jedem hier klar. Im Linkerskript ist einstellbar, wo im Adressraum verschiedene Speicherbereiche - darunter auch der/die für malloc und new liegen. Das hat erstmal überhaupt nichts damit zu tun, ob das nun ROM oder RAM ist. Damit wäre theoretisch auch möglich, das in den ROM zu legen, was aber in der Praxis natürlich keiner macht. Ein Tool wird nicht unsinnig, nur weil es theoretisch auch möglich wäre, damit unsinnige Dinge zu tun.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.