Advertisement
Guest User

Untitled

a guest
Nov 25th, 2014
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.25 KB | None | 0 0
  1. #include "speicher.hh"
  2.  
  3. const int halden_groesse = 32768;
  4.  
  5. // Struktur der Speicherbloecke in der Freispeicherliste:
  6. // Kopf mit zwei Worten (GROESSE, VERKETTUNG), dann eigentlicher Inhalt
  7.  
  8. enum {
  9. GROESSE = 0, // Groesse in Worten (inkl. Kopf)
  10. VERKETTUNG = 1, // Verkettung auf naechsten Kopf
  11. KOPFGROESSE = 2 // ab hier "Nutzlast" */
  12. };
  13.  
  14. // Das "NIL" fuer unsere Freispeicherliste
  15.  
  16. const int verkettungs_ende = -1;
  17.  
  18. // Die Halde:
  19. // Freispeicherliste initialisiert mit:
  20. // heap[0+GROESSE] = halden_groesse, heap[0+VERKETTUNG] = verkettungs_ende
  21.  
  22. Wort heap[halden_groesse] = { halden_groesse, verkettungs_ende };
  23.  
  24. // Der Index des Kopfes der Freispeicherliste in der Halde
  25.  
  26. int frei_index = 0; // Initial: Verweis auf initialen grossen Block
  27.  
  28.  
  29. Zeiger anlegen(int groesse) {
  30. groesse+=KOPFGROESSE; // Platz fuer Kopf noetig
  31.  
  32.  
  33. int i = frei_index;
  34. int preferred_index = -1;
  35. int prev_i = i;
  36.  
  37. do {
  38. //Freispeicher komplett dem User geben weil kein Spalten mehr möglich
  39. if(heap[i] >= groesse && heap[i] <= groesse+2) {
  40. heap[prev_i+1] = heap[i+1]; //Speicherbereich aus Liste entfernen
  41. return &heap[i+KOPFGROESSE];
  42. }
  43. //passenden Freispeicher gefunden, aber zu gross -> durchlaufen bis best fit
  44. else if(heap[i] > groesse+2) {
  45. //Falls schon ein fit gefunden wurde
  46. if(preferred_index > -1) {
  47. //falls ein besserer fit gefunden wurde
  48. if(heap[preferred_index] > heap[i]) preferred_index = i;
  49. }
  50. //falls bisher noch kein fit gefunden wurde
  51. else preferred_index = i;
  52. }
  53. prev_i = i;
  54. i = heap[i+1];
  55. }while(i != -1);
  56.  
  57. //ungenügender freier speicher
  58. if(preferred_index == -1) return 0;
  59.  
  60.  
  61. //Split index finden
  62. int split_index = preferred_index + heap[preferred_index]-groesse;
  63. //Reservierte groesse vom alten Block abziehen
  64. heap[preferred_index] -= groesse;
  65. //groesse des neuen blocks festlegen
  66. heap[split_index] = groesse;
  67. return &heap[split_index+KOPFGROESSE];
  68. }
  69.  
  70. void freigeben(Zeiger speicher_block) {
  71. /* Aufnehmen von speicher_block in die Freispeicherliste */
  72.  
  73. int * verkettungs_index = speicher_block-1;
  74. int * groesse = speicher_block-2;
  75.  
  76. //Freispeicher in verkettete Liste einhängen
  77. *verkettungs_index = frei_index;
  78. frei_index = groesse - heap;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement