• 学习STL中的内存管理


    下面是自己写的一段极简单的模拟STL中的内存管理方法,仅是个人理解,而且,只模拟我自己理解的部分

     1 #include "stdlib.h"
     2 
     3 union obj
     4 {
     5     union obj* next;
     6     char data[1];                    // 这个char* data本是为了理解起来更容易而声明的,但是我第一次看到它却被搞糊涂了,因此干脆简化成了下面的版本,功能上一模一样
     7 };
     8 
     9 struct memory_space_ptr
    10 {
    11     struct memory_space_ptr* next;    // 这个指针很有技巧:如果该空间是可用的,这个指针用来指向下一个可用空间;如果这个空间被用了,这个指针就会被覆盖
    12 };
    13 
    14 int main(int argc, char* argv[])
    15 {
    16     // 申请空间,建立free_list的过程
    17     void* res = malloc(16);
    18     memory_space_ptr* third = (memory_space_ptr*) res;
    19     third->next = NULL;
    20 
    21     res = malloc(16);
    22     memory_space_ptr* second = (memory_space_ptr*) res;
    23     second->next = third;
    24 
    25     res = malloc(16);
    26     memory_space_ptr* first = (memory_space_ptr*) res;
    27     first->next = second;
    28 
    29     memory_space_ptr* free_list[16];             // 每一个allocator维护一个自己的16个(指向可用空间的指针的链表的)头指针
    30     free_list[1] = first;                        // 每个链表维护的空间大小不同,free_list[0]维护8字节的可用空间链,free_list[1]维护16字节的可用空间链,后面依次加8字节
    31     
    32     // 使用和回收free_list中的空间的过程
    33     {
    34 
    35         char* str = "123456789012345";
    36 
    37         // 使用第一个空间
    38         char* free_space = (char*)free_list[1];                        // free_list[1] 提供一个可用空间的指针
    39         free_list[1] = free_list[1]->next;                             // free_list[1] 自己跳转到下一个可用空间
    40         strcpy(free_space, str);  
    41         printf("%s
    ", free_space);
    42 
    43         // 使用第二个空间
    44         char* free_space_2 = (char*)free_list[1];                      // free_list[1] 提供一个可用空间的指针
    45         free_list[1] = free_list[1]->next;                             // free_list[1] 自己跳转到下一个可用空间
    46         strcpy(free_space_2, str);
    47         printf("%s
    ", free_space_2);
    48 
    49         // 回收第一个空间
    50         ((memory_space_ptr*)free_space)->next = free_list[1]->next;    // 接过free_list[1]所指向的下一个可用空间
    51         free_list[1]->next = (memory_space_ptr*) free_space;           // free_list[1]则指向刚刚回收的这块空间
    52 
    53         // 回收第二个空间
    54         ((memory_space_ptr*)free_space_2)->next = free_list[1]->next;
    55         free_list[1]->next = (memory_space_ptr*) free_space_2;
    56 
    57 
    58         /*
    59         // 再次利用。。。
    60         free_space = (char*)free_list[1];                              // free_list[1] 提供一个可用空间的指针
    61         free_list[1] = free_list[1]->next;                             // free_list[1] 自己跳转到下一个可用空间
    62         strcpy(free_space, str); 
    63         printf("%s
    ", free_space);
    64         // 。。。
    65         */
    66     }
    67     getchar();
    68     return 0;
    69 }
  • 相关阅读:
    javascript之数组的6种去重方法
    javascript之存储数据-cookie,localStorage,sessionStorage
    {less}
    javaScript的几个问题简答
    33 web页面-页面操作(鼠标、键盘操作)
    32 web页面-页面操作(元素等待、三大切换)
    31 Xpath复杂元素定位 find_element
    30 selenium (元素定位、webelement对象)
    29 HTML(定位标签的属性)
    28 selenium
  • 原文地址:https://www.cnblogs.com/zanzan101/p/3327266.html
Copyright © 2020-2023  润新知