Sử dụng đóng gói trên cấu trúc cũng có nghĩa là trình biên dịch không thể sắp xếp lại cấu trúc dữ liệu, trên một số nền tảng đóng gói có thể giảm hiệu suất rất lớn. Một số bộ vi xử lý không thể nhận được các từ chưa được ký kết vì vậy nếu mã sẽ được biên dịch trên nền tảng đó thì trình biên dịch sẽ buộc phải lấy từ trên mỗi byte và dịch chuyển mọi thứ ở đúng nơi, đây chắc chắn là thứ bạn không muốn. Đặc biệt không có trong danh sách liên kết vì điều này sẽ làm cho danh sách của bạn thực sự thực sự rất chậm truy cập ... Và ngay cả khi cpu hỗ trợ unaligned nhận được CPU sẽ cần phải thực hiện thêm chu kỳ để đọc từ 2 địa chỉ trong bộ nhớ và concat chúng một lần nữa.
Đây là lý do tại sao bạn phải xem cách bạn có thể trợ giúp trình biên dịch. Bạn sẽ muốn bạn cấu trúc được từ liên kết để địa chỉ của nút tiếp theo luôn luôn có thể được đọc với một hướng dẫn đọc duy nhất. Điều này có nghĩa là đối với kiến trúc 64bit bạn muốn đặt con trỏ của nút tiếp theo lên trên, do đó, điều này luôn được căn chỉnh, tiếp theo bạn sẽ muốn đảm bảo rằng nếu bạn sử dụng cấu trúc trong mảng, địa chỉ struct node *
sẽ luôn là liên kết, vì vậy bạn cần đảm bảo rằng kích thước cấu trúc cuối cùng của bạn là bội số của 8 byte. Điều này có nghĩa là bạn có thể thêm 6 phần tử hoặc bạn có thể chọn loại dữ liệu lớn hơn.
Điều này có nghĩa bạn sẽ nhận được một cái gì đó như thế này:
typedef struct __attribute__((packed)) node {
struct node *next;
char data[8];
} nodea;
typedef struct __attribute__((packed)) node {
struct node *next;
uint16_t data[4];
} nodea;
typedef struct __attribute__((packed)) node {
struct node *next;
uint32_t data[2];
} nodea;
vv vv vv
Tôi nghĩ rằng với đóng gói chặt chẽ, bạn sẽ kết thúc với 8 byte cho con trỏ và 2 byte cho các nhân vật ... nhưng không chắc chắn 100%. Hãy xem #pragmas cho trình biên dịch của bạn có ảnh hưởng đến việc đóng gói cấu trúc, chọn một gói cung cấp đóng gói chặt chẽ nhất và thử sizeof(). –
Trên nền tảng nào, 32bit hoặc 64bit, trình biên dịch (phiên bản) nào? –