Struct trong struct hay con trỏ đến struct – cách chọn đúng?
🧱 1. Nhúng trực tiếp struct A vào trong struct B
struct A {
int x;
};
struct B {
struct A a; // nhúng trực tiếp
};
📌Dùng khi:
- Struct A là thành phần bắt buộc của B, luôn tồn tại cùng B.
- Không cần cấp phát động hay quản lý bộ nhớ riêng cho A.
- Hiệu năng quan trọng: truy cập nhanh, không qua con trỏ.
✅ Ưu điểm
- Dễ dùng, không cần
malloc
hayfree
. - Không lo rò rỉ bộ nhớ.
- Dữ liệu nằm liền mạch trong bộ nhớ → cache-friendly.
❌ Nhược điểm:
- Không thể chia sẻ A giữa nhiều B.
- Không linh hoạt nếu A có kích thước lớn hoặc thay đổi động.
🧷 2. Dùng con trỏ đến struct A trong struct B
struct A {
int x;
};
struct B {
struct A* a; // con trỏ
};
📌 Dùng khi:
A
là tùy chọn, có thể có hoặc không.A
có thể được chia sẻ giữa nhiềuB
.A
có thể thay đổi kích thước hoặc cấu trúc động.- Cần trì hoãn khởi tạo
A
. - Muốn đa hình (
struct A
có thể là nhiều kiểu khác nhau qua con trỏ).
✅Ưu điểm:
- Linh hoạt trong quản lý bộ nhớ.
- Có thể thay thế A mà không thay đổi B.
- Hữu ích trong các cấu trúc phức tạp như cây, danh sách liên kết, v.v.
❌ Nhược điểm:
- Cần quản lý bộ nhớ thủ công (
malloc
,free
). - Dễ gây rò rỉ bộ nhớ hoặc lỗi truy cập nếu không cẩn thận.
- Truy cập chậm hơn một chút do phải qua con trỏ.
All rights reserved