From 1fa6d12e0c0a2b9a383c946be39b4d6f09c5f826 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sat, 24 Oct 2026 10:03:57 +0000 Subject: implement free Perf index = 40 (util) + 5 (thru) = 45/100 --- malloclab-handout/util/mm-naive-free.h | 86 ++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 malloclab-handout/util/mm-naive-free.h (limited to 'malloclab-handout/util') diff --git a/malloclab-handout/util/mm-naive-free.h b/malloclab-handout/util/mm-naive-free.h new file mode 100644 index 0000000..47a9f02 --- /dev/null +++ b/malloclab-handout/util/mm-naive-free.h @@ -0,0 +1,86 @@ +#pragma once + +#include + +#include "../mm.h" +#include "../memlib.h" + + +using namespace std; + +/* single word (4) or double word (8) alignment */ +#define ALIGNMENT 8 + + +inline constexpr bool OV4_VERBOSE = true; + +/* rounds up to the nearest multiple of ALIGNMENT */ +inline size_t align(size_t size) +{ + return (((size) + (ALIGNMENT-1)) & ~0x7); +} + +inline constexpr size_t SIZE_T_SIZE = 8; + +inline bool is_alloc(size_t status) +{ + return (status&0x1); +} +inline bool is_prev_alloc(size_t status) +{ + return (status&0x2) >> 1; +} +inline void set_alloc(size_t &status, bool is_alloc) +{ + if (is_alloc) + status |= 0x1; + else + status &= 0xfffffffe; +} +inline void set_prev_alloc(size_t &status, bool is_prev_alloc) +{ + if (is_prev_alloc) + status |= 0x2; + else + status &= 0xfffffffd; +} +inline size_t get_size(size_t status) +{ + // ignore lowest 2 bits + return status&0xfffffffc; +} +inline void set_size(size_t &status, size_t size) +{ + status &= 0x3; + status |= (size & 0xfffffffc); +} +inline size_t offset(size_t p) +{ + return (size_t)((size_t)p-(size_t)mem_heap_lo()); +} +inline void next(size_t &p) +{ + p += get_size(*(size_t*)p); +} + +template< class... Args > +void loggerln( std::format_string fmt, Args&&... args ) { if constexpr (OV4_VERBOSE) println(fmt, forward(args)...); } + +template< class... Args > +void logger( std::format_string fmt, Args&&... args ) { if constexpr (OV4_VERBOSE) print(fmt, forward(args)...); } + + +void print_list() +{ + logger("print_list: "); + size_t p = (size_t)mem_heap_lo(); + while (true) + { + if (p >= (size_t)mem_heap_hi()) + break; + + logger("{} ", offset(p)); + p += get_size(*(size_t*)p); + } + loggerln(""); +} \ No newline at end of file -- cgit v1.3.1-4-g156e