美文网首页箱子的VEXC语言
如何在没有Malloc的情况下动态管理内存 V2.0

如何在没有Malloc的情况下动态管理内存 V2.0

作者: 宅纸箱 | 来源:发表于2017-09-01 22:18 被阅读13次

    为啥VEX没有malloc啊~~~

    问:当没有malloc的情况下,应该怎么办
    答:没有枪,没有炮,自己给自己造~~~
    

    经过上次的实践,我们已知要做出和原版malloc相似的功能至少需要三样东西。

    1. 一块可以访问的内存块
    2. 表示数据在内存中位置的值(指针)
    3. 访问数据的方法

    在上个版本的内存管理中,第一个要素是一个由MemoryUnit 组成的数组,第二个要素为一个int值,来保存取得的MemoryUnit位置。因为第二个要素不是原生的指针,所以需要额外的Get和Set函数来作为第三要素。
    那么如果把第二要素改为原生的指针,就不需要额外的读取和保存方法。在使用高级的数据结构时也不需要另外修改结构。

    什么是指针

    变量二要素
    1.储存空间
    2.读取方法

    基本上看过C的人都对指针有一定了解。指针是一个值。一个指向对应内存地址的值。指针虽然有不同的类型,像int指针,char指针,结构体指针,但是指针读取方法是不变的。唯一不同的是指针指向的空间大小是变化的。
    实验1

    void main(){
        char memory[10];
        int* num=(int*)memory;
        int* num2=(int*)&(memory[4]);
        printf("num: %p\n",num);
        printf("num2: %p\n",num2);
    }
    
    output:
        num: 0079FB44
        num2: 0079FB49
    

    从上述实验可以看出char指针可以转换为int并且可以正常使用。这证实了一件事情,不同类型的指针是可以相互转换的,只要空间大小匹配使用是没有问题的。
    那根据以上的描述和原装的函数定义char* malloc(int size)可以脑补出大致的结构。

    动态内存管理实现

    那就上代码吧

    void init() {
        for (int i = 0; i<MEMORY_SIZE; i++) {
            heap[i] = 0;
            info[i] = 0;
        }
        coreState.memorySize = MEMORY_SIZE;
        coreState.state = 1;
        coreState.freeMemoryCount = MEMORY_SIZE;
    }
    
    int* malloc(int size) {
        for (int i = 0; i<MEMORY_SIZE; i++) {
            int notEnoughSpacce = 0;
            if (info[i] == 0) {
                if ((i + size)<MEMORY_SIZE) {
                    for (int j = 0; j<size; j++) {
                        if (info[j + i] != 0)
                        notEnoughSpacce = 1;
                    }
                    if (notEnoughSpacce == 0) {
                        for (int j = 0; j<size; j++) {
                            info[j + i] = 1;
                        }
                        return &(heap[i]);
                    }
                }
            }
        }
        return &null;
    }
    
    void free(int* pointer, int size) {
        for (int i = 0; i<MEMORY_SIZE; i++) {
            if (&(heap[i]) == pointer) {
                for (int j = 0; j<size; j++) {
                    heap[i + i] = null;
                    info[j + i] = 0;
                    
                }
            }
        }
    }
    

    可以看出,与上次的架构相比,这次的可以使用c原装的指针来访问相应的位置。在使用高级的数据结构时也更加方便。

    相关文章

      网友评论

        本文标题:如何在没有Malloc的情况下动态管理内存 V2.0

        本文链接:https://www.haomeiwen.com/subject/jlxljxtx.html