Alignment của các biến trong bộ nhớ (một Truyện ngắn).
Trong các máy tính trước đây có dữ liệu 8 bit. Điều này có nghĩa, mỗi chu kỳ xung nhịp 8 bit thông tin có thể được xử lý. Vậy thì tốt thôi.
Sau đó, đến máy tính 16 bit. Do khả năng tương thích xuống và các vấn đề khác, byte 8 bit được giữ lại và từ 16 bit được giới thiệu. Mỗi từ là 2 byte. Và mỗi chu kỳ đồng hồ 16 bit thông tin có thể được xử lý. Nhưng điều này đặt ra một vấn đề nhỏ.
Hãy nhìn vào bản đồ bộ nhớ:
+----+
|0000|
|0001|
+----+
|0002|
|0003|
+----+
|0004|
|0005|
+----+
| .. |
Tại mỗi địa chỉ có một byte có thể được truy cập riêng rẽ. Nhưng các từ chỉ có thể được tìm nạp tại các địa chỉ đồng đều. Vì vậy, nếu chúng ta đọc một từ tại 0000, chúng ta đọc các byte tại 0000 và 0001. Nhưng nếu chúng ta muốn đọc từ tại vị trí 0001, chúng ta cần hai truy cập đọc. Đầu tiên 0000,0001 và sau đó 0002,0003 và chúng tôi chỉ giữ 0001.0002.
Tất nhiên việc này mất thêm thời gian và điều đó không được đánh giá cao. Vì vậy, đó là lý do tại sao họ phát minh ra sự liên kết. Vì vậy, chúng tôi lưu trữ các biến từ ở các ranh giới từ và các biến byte tại các ranh giới byte.
Ví dụ, nếu chúng ta có một cấu trúc với một lĩnh vực byte (B) và một lĩnh vực từ (W) (và một trình biên dịch rất ngây thơ), chúng tôi nhận được như sau:
+----+
|0000| B
|0001| W
+----+
|0002| W
|0003|
+----+
Mà không phải là niềm vui . Nhưng khi sử dụng căn chỉnh từ chúng tôi tìm thấy:
+----+
|0000| B
|0001| -
+----+
|0002| W
|0003| W
+----+
Bộ nhớ ở đây được hy sinh cho tốc độ truy cập.
Bạn có thể tưởng tượng rằng khi sử dụng từ kép (4 byte) hoặc từ bốn (8 byte), điều này thậm chí còn quan trọng hơn. Đó là lý do tại sao với hầu hết các trình biên dịch hiện đại, bạn có thể chọn liên kết bạn đang sử dụng trong khi biên dịch chương trình.
Vì những người khác đã giải thích sắp xếp ngăn xếp là gì và tại sao nó được sử dụng, tôi chỉ muốn thêm hai xu của tôi về _ "Nó có thể được kiểm soát bởi các thiết lập trình biên dịch không?" _. Xem [câu hỏi này] (http://stackoverflow.com/questions/5496045/why-is-my-stack-pointer-only-incrementing-in-multiples-of-16?lq=1) – andreee