美文网首页箱子的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