Xem ví dụ sau đây: Viết một struct message_t đơn giản để quản lí các thông tin và dữ liệu của message
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h> typedef struct { uint8_t event_id; uint8_t sender_id; void* payload; // con trỏ tới vùng nhớ ngay sau struct uint8_t size_payload;
} Message_t; Message_t* Message_Create(uint8_t event, uint8_t sender, const char* str) { size_t len = strlen(str) + 1; // +1 để chứa cả ký tự null terminator // Cấp phát chung: struct + payload Message_t* newMessage = (Message_t*)malloc(sizeof(Message_t) + len); if (newMessage == NULL) return NULL; newMessage->event_id = event; newMessage->sender_id = sender; newMessage->size_payload = (uint8_t)len; // payload nằm ngay sau struct newMessage->payload = (uint8_t*)newMessage + sizeof(Message_t); memcpy(newMessage->payload, str, len); return newMessage;
} void Message_Free(Message_t* msg) { free(msg); // chỉ cần free 1 lần
} int main() { Message_t* msg = Message_Create(1, 42, "Hello OS!"); printf("dia chi bat dau message_t: %p\n", msg); printf("dia chi cua event_id: %p\n", &msg->event_id); printf("dia chi cua sender_id: %p\n", &msg->sender_id); printf("dia chi cua payload: %p\n", &msg->payload); printf("dia chi cua size_payload: %p\n", &msg->size_payload); printf("dia chi bat dau du lieu: %p\n", msg->payload); Message_Free(msg); return 0;
}
Output
dia chi bat dau message_t: 0x55752a7582a0
dia chi cua event_id: 0x55752a7582a0
dia chi cua sender_id: 0x55752a7582a1
dia chi cua payload: 0x55752a7582a8
dia chi cua size_payload: 0x55752a7582b0
dia chi bat dau du lieu: 0x55752a7582b8
Ta thấy được việc chưa tối ưu về vị trí các trường trong struct sẽ làm lãng phí bộ nhớ.
Theo như sắp xêp như trên
event_id
: chiếm 1 bytesender_id
: chiếm 1 bytepadding
: 6 bytepayload
: 8 bytesize_payload
: 1 bytepadding
: 7 byte
=> Tổng cộng: 24 byte.
Nhưng nếu bây giờ ta sắp xếp lại thứ tự các trường trong struct như sau:
typedef struct { uint8_t event_id; uint8_t sender_id; uint8_t size_payload; void* payload;
} Message_t;
event_id
: 1 bytesender_id
: 1 bytesize_payload
: 1 bytepadding
: 5 bytepayload
: 8 byte
-> Tổng cộng: 16 byte, tiết kiệm được 8 byte.
Rút ra kết luận: Việc sắp xếp thứ tự các trường trong struct rất quan trọng trong việc tiết kiệm bộ nhớ và vẫn đảm bảo hiệu năng.