Forum: PC-Programmierung Wo wird physikalisch new und malloc gespeichert


von Kadse (Gast)


Lesenswert?

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

von Bernd K. (prof7bit)


Lesenswert?

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()

von Pandur S. (jetztnicht)


Lesenswert?

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.

von Michael B. (laberkopp)


Lesenswert?

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).

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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
von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von nfet (Gast)


Lesenswert?

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.

von nfet (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

"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.

von Michael B. (laberkopp)


Lesenswert?

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.

von georg (Gast)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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.

von Frank O. (fop)


Lesenswert?

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.
von Rolf M. (rmagnus)


Lesenswert?

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
Noch kein Account? Hier anmelden.