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
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí