Eigenes malloc



  • Hallo,

    gibt es einen Code für ein eigenes malloc ?

    void* MyOwnMalloc(size_t bytes)
    {
    	char x[8];
        return x;
    }
    

    Bei meiner Lösung liegt es aufm stack. Also ist sie wohl falsch. Vorallem find ich es immer so blöd dass die array Größe konstant sein muss. Welchen grund hat das denn nochmal .



  • SO funktioniert es bestimmt nicht.

    Und wo ist bei deiner funktion die Variable Größe, die bei dir mit dem parameter "bytes" übergeben wird? 🙄



  • Das Betriebssystem verwaltet den RAM-Speicher.

    Die meisten malloc-Implementierungen enthalten deswegen, denke ich mal, nur irgendwelche syscalls, die beim Betriebssystemkernel mehr Speicherplatz bestellen.



  • syscalls schrieb:

    Das Betriebssystem verwaltet den RAM-Speicher.

    Ja, aber in der Regel nicht so feingranular, wie das malloc/free braucht.

    Die meisten malloc-Implementierungen enthalten deswegen, denke ich mal, nur irgendwelche syscalls, die beim Betriebssystemkernel mehr Speicherplatz bestellen.

    Tja, falsch gedacht.

    Eine mögliche Heap-Implementation findet sich übrigens in Kernighan&Ritchie, Kapitel 8.



  • hahahahahahaha schrieb:

    SO funktioniert es bestimmt nicht.

    Und wo ist bei deiner funktion die Variable Größe, die bei dir mit dem parameter "bytes" übergeben wird? 🙄

    Aber wieso ? Ist es falsch weil es auf dem stack liegt oder weil die arraygröße fest kodiert ist ? Aber ein array nimmt aber nur konstante werte.



  • Aber wieso ? Ist es falsch weil es auf dem stack liegt oder weil die arraygröße fest kodiert ist ? Aber ein array nimmt aber nur konstante werte.

    Beides. Wenn man von VLAs absieht, stimmt das natürlich. Darum ist deine Funktion auch falsch.
    Wie Bashar schon gesagt hat, in "The C Programming Language" ist eine Implementierung von malloc drin. Die ist aber nicht ganz so trivial wie deine malloc-Funktion.



  • blurry333 schrieb:

    Ist es falsch weil es auf dem stack liegt oder weil die arraygröße fest kodiert ist ? Aber ein array nimmt aber nur konstante werte.

    1. In dem Augenblick, wo die Funktion verlassen wird, wird der entsprechende Teil des Stacks freigegeben und kann von der nächsten Funktion überschrieben werden.

    2. Beim Start des Programms wird nur ein relativ kleiner Teil des Speichers für den Stack reserviert (z.B. bei Windows 1 MB, bei Linux etwas mehr). Zwar gibt es Mechanismen, die den Stackspeicher dynamisch vergrößern, die schlagen aber oft genug fehl, z. B. wenn zuviel Stack auf einmal angefordert wird.

    3. Bei neueren C-Compilern (MSVC gehört nicht dazu), kann Stack auch dynamisch angefordert werden (Stichwort: VLA). Machen sollte so etwas nur, wenn es gar nicht anders geht (wg. Punkt 2)).

    Wenn Du mitteilst, warum Du eigentlich malloc ersetzen willst, dann könnte man sich etwas überlegen. Ich selbst falle immer wieder auf malloc zurück, weil es einfach das Bequemste ist. Wenn die malloc's und realloc's mir über den Kopf wachsen, wechsle ich die Programmiersprache.

    viele grüße
    ralph



  • malloc bzw. die C Bibliothek kümmern sich soweit wie möglich selbst um die Speicherverwaltung.
    Anfragen an das Betriebssystem sind vergleichsweise langsam, da sie keine Funktionsaufrufe sind, sondern per Interrupt geschehen.

    Hier eine Einführung in die Speicherverwaltung, dort siehst du auch eine primitive Implementierung von malloc/free:

    https://www.ibm.com/developerworks/library/l-memory/


Anmelden zum Antworten