Phần cứng phức tạp; đây là một lời giải thích đơn giản.
Máy tính hiện đại điển hình có thể có bus dữ liệu 32 bit. Điều này có nghĩa rằng bất kỳ tìm nạp nào mà CPU cần làm sẽ lấy tất cả 32 bit của một địa chỉ bộ nhớ cụ thể. Vì bus dữ liệu không thể tìm nạp bất kỳ thứ gì nhỏ hơn 32 bit, nên hai bit địa chỉ thấp nhất thậm chí không được sử dụng trên bus địa chỉ, vì vậy nó giống như RAM được sắp xếp thành chuỗi 32 bit từ thay vì 8- bit byte.
Khi CPU thực hiện tìm nạp một byte, chu trình đọc trên bus sẽ tìm 32 bit và sau đó CPU sẽ loại bỏ 24 bit đó, tải 8 bit còn lại vào bất kỳ thanh ghi nào. Nếu CPU muốn lấy một giá trị 32 bit đó là không xếp trên một ranh giới 32-bit, nó có nhiều lựa chọn chung:
- thực hiện hai chu kỳ đọc riêng biệt trên xe buýt để tải những phần thích hợp của từ dữ liệu và ghép lại chúng
- đọc từ 32 bit tại địa chỉ được xác định bằng cách vứt bỏ hai bit thấp của địa chỉ
- đọc một số kết hợp byte bất ngờ được lắp ráp thành từ 32 bit, có thể không phải là từ bạn muốn
- ném một ngoại lệ
CPU khác nhau mà tôi đã làm việc với đã lấy tất cả bốn trong số các đường dẫn đó. Nói chung, để có khả năng tương thích tối đa, an toàn nhất là căn chỉnh tất cả các lần đọc n bit thành ranh giới n-bit. Tuy nhiên, bạn chắc chắn có thể thực hiện các lối tắt nếu bạn chắc chắn rằng phần mềm của bạn sẽ chạy trên một số gia đình CPU cụ thể với hành vi đọc chưa được biết. Và ngay cả khi đọc unaligned là có thể (chẳng hạn như trên x86 gia đình CPU), họ sẽ chậm hơn.
Nguồn
2009-10-18 07:46:27
http://www.ibm.com/developerworks/library/pa-dalign/ – KawaiKx
* hai bit địa chỉ thấp nhất thậm chí không được sử dụng trên bus địa chỉ * Nếu vậy thì cách địa chỉ 32 bit được giải quyết với chỉ 30 bit? Đúng nếu tôi đã sai lầm. –