سالیدیفا

حافظه

حافظه (Memory) لیستی از بایت‌ها هست. به هر بایت میشه به صورت جداگانه دسترسی داشت. مشابه با حافظه رم (RAM)، حافظه در ابتدا کاملاً خالیه. همچنین فرارم هست، یعنی وقتی اجرا تموم شد، حافظه ریست میشه. هر سلول حافظه میتونه یک بایت (۸ بیت) رو تو خودش نگه داره. یه عدد بین ۰ تا ۲۵۵.

حافظه رو میشه مثل یه لیست ساده در نظر گرفت که میشه با یه شماره‌گذاری (index) یا یه آفست (offset) بهش دسترسی داشت.

آفست 2 به معنای اینه که بایت موجود در ایندکس 2 رو دریافت می‌کنیم. اگه یه سایزی (size) هم داشته باشیم، میتونیم یه تیکه از بایت‌ها رو بگیریم. مثلا آفست ۲ و سایز ۵، بایت‌های شماره ۲ تا ۷ رو برمی‌گردونه.

class SimpleMemory:
    def __init__(self): self.memory = []
        
    def access(self, offset, size): return self.memory[offset:offset+size]
    def load  (self, offset):       return self.access(offset, 32)
    def store (self, offset, value): self.memory[offset:len(value)] = value

افزایش اندازه حافظه باعث مصرف گس به صورت غیرخطی میشه و هر چی فضای حافظه بزرگتر و بزرگتر بشه، هزینه هم بیشتر و بیشتر میشه.

حالا بیایید محاسبه‌ی میزان افزایش گس رو به حافظه اضافه کنیم.

class Memory(SimpleMemory):
    def store(self, offset, value):
        memory_expansion_cost = 0
        
        if len(self.memory) <= offset:
            
            expansion_size = 0
            
            # initialize memory with 32 zeros if it is empty
            if len(self.memory) == 0:
                expansion_size = 32
                self.memory = [0x00 for _ in range(32)]
                
            # extend memory more if needed
            if len(self.memory) - offset < 0:
                expansion_size += offset - len(self.memory)
                self.memory.append(0x00 * expansion_size)
                
            memory_expansion_cost = expansion_size**2 # simplified!
                
        super().store(offset, value)
        return memory_expansion_cost

حالا بیاید یه حافظه ایجاد کنیم:

memory = Memory()

ما 4 تا مقدار رو تو آفست 0 ذخیره میکینم.

memory.store(0, [0x01, 0x02, 0x03, 0x04]);

load اگه بتونه، همیشه باید 32 بایت برگردونه.

memory.load(0)
[1,
 2,
 3,
 4,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0]

پیشرفته #

این روش واقعی محاسبه هزینه گس برای افزایش حافظست.

def calc_memory_expansion_gas(memory_byte_size):
    memory_size_word = (memory_byte_size + 31) / 32
    memory_cost = (memory_size_word ** 2) / 512 + (3 * memory_size_word)
    return round(memory_cost)
احساست در مورد این مقاله چیه؟