0

memory pool đơn giản

#include <stdio.h>
#include <stdlib.h>

struct memorypool
{
  char infor;
  int* p;
};

int main()
{
  struct memorypool MEMORY_A;
  MEMORY_A.p = (int*)malloc(10 * sizeof(int));
  
  printf("dia chi cua struct: %p\n", (void *)&MEMORY_A);
  printf("dia chi cua p trong struct: %p\n", (void *)&MEMORY_A.p);
  printf("dia chi cua block memory: %p\n", (void *)MEMORY_A.p);
  
  free(MEMORY_A.p);
   return 0;
}

OUTPUT

dia chi cua struct: 0x7fff87d23dc0
dia chi cua p trong struct: 0x7fff87d23dc8
dia chi cua block memory: 0x5598a0c032a0

Tại vì sao ở đây khoảng cách giữa 2 member infor*p lại là 8 byte trong khi kiểu char chỉ chiếm 1 byte.

  • Compiler sẽ căng chỉnh (algn) biến trong struct theo kích thước lớn nhất của biến có trong struct . Ở đây là con trỏ có kích thước 8 byte
  • Khoảng cách 8 byte = 1 byte char + 7 byte padding.

image.png

Ý tưởng

Memory pool bao gồm 2 khối bộ nhớ:

  • Lưu trữ thông tin memory pool
  • Trỏ tới vùng nhớ được cấp phát cho memory pool quản li.

image.png

#include <stdio.h>
#include <stdlib.h>

struct memorypool {
    char infor;
    int *p;   // sẽ trỏ tới vùng nhớ ngay sau struct
};

int main() {
    size_t n = 10;  // số phần tử muốn chứa
    // cấp phát: 1 struct + vùng nhớ cho n int
    void *raw = malloc(sizeof(struct memorypool) + n * sizeof(int));
    if (!raw) return -1;

    // trỏ struct vào đầu
    struct memorypool *mp = (struct memorypool *)raw;
    mp->infor = 'A';

    // cho p trỏ ngay sau struct
    mp->p = (int *)(mp + 1);

    // sử dụng
    for (size_t i = 0; i < n; i++) {
        mp->p[i] = i * 10;
    }

    printf("Struct addr = %p\n", (void *)mp);
    printf("Pool addr   = %p\n", (void *)mp->p);

    for (size_t i = 0; i < n; i++) {
        printf("p[%zu] = %d\n", i, mp->p[i]);
    }

    free(raw);
    return 0;
}

Output

Struct addr = 0x559d8871c2a0
Pool addr   = 0x559d8871c2b0
p[0] = 0
p[1] = 10
p[2] = 20
p[3] = 30
p[4] = 40
p[5] = 50
p[6] = 60
p[7] = 70
p[8] = 80
p[9] = 90

Nếu ta lấy 2 địa chỉ trừ cho nhau: pool addr - struct addr = 0x559...b0 - 0x559...a0 = 16 byte, đúng với kích thước của struct. image.png

Đây là bước đầu tiên để triển khai memory pool


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.