Tôi đang làm việc với các cấu trúc và có một số câu hỏi về chúng. Khi tôi hiểu các biến cấu trúc sẽ được đặt ở bộ nhớ tuần tự. Độ dài của khối (từ) phụ thuộc vào kiến trúc máy (32 bit - 4 byte, 64 bit - 8 byte).C: Cấu trúc dữ liệu căn chỉnh
phép nói rằng chúng tôi có 2 cấu trúc dữ liệu:
struct ST1 {
char c1;
short s;
char c2;
double d;
int i;
};
Trong bộ nhớ nó sẽ là:
32 bit - 20 bytes
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
------------------------------------------------------------------------------------------
c1| PB| s | s | c1| PB| PB| PB| d | d | d | d | d | d | d | d | i | i | i | i |
64 bit - 24 bytes | 20 | 21 | 22 | 23 |
previous sequence + ---------------------
| PB | PB | PB | PB |
Nhưng chúng ta có thể sắp xếp lại nó, để làm cho dữ liệu này phù hợp vào từ máy. Như thế này:
struct ST2 {
double d;
int i;
short s;
char c1;
char c2;
};
Trong trường hợp này cho cả 32 và 64 bit nó sẽ được biểu diễn tại cùng một cách (16 byte):
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
----------------------------------------------------------------------
d | d | d | d | d | d | d | d | i | i | i | i | s | s | ch1| ch2|
Tôi có một vài câu hỏi:
- Giống như dự đoán hoang dã nhưng quy tắc chính cho
struct
là xác định các biến có kích thước lớn hơn lúc đầu? - Vì tôi hiểu nó không hoạt động với các biến độc lập. Thích
char str[] = "Hello";
? - byte đệm, mã nào có? Nó ở đâu đó tại bảng ASCII? Xin lỗi, không thể tìm thấy nó.
- 2 cấu trúc với tất cả các thành viên được đại diện ở bộ nhớ theo các địa chỉ khác nhau và chúng có thể được đặt không tuần tự ở bộ nhớ?
- Cấu trúc như vậy:
struct ST3 { char c1; char c2; char c3;} st3;
Cósize = 3
, tôi hiểu rằng nếu chúng tôi sẽ thêm thành viên có loại khác vào nó, nó sẽ được căn chỉnh. Nhưng tại sao nó không liên kết trước nó?
chờ đợi, cái gì? sử dụng 'đóng gói' sẽ loại bỏ phần đệm, có thể buộc các thành viên * không * được căn chỉnh chính xác, có tác động ngay cả trên x86 (ví dụ: truy cập' double' chỉ là nguyên tử nếu nó được căn chỉnh chính xác) – Christoph
Như Cristoph nói, câu trả lời này là thông tin sai lạc hoàn chỉnh. – Casey