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 và *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.

Ý 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.

#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.

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