2012-06-19 27 views
5

Loại của mỗi thành viên của cấu trúc thường có một căn chỉnh mặc định là thành phần cấu trúc i.e.each được căn chỉnh trên một ranh giới được xác định trước. Vì lý do này đệm được thực hiện trong ví dụ wiki sau:Tại sao lại ưu tiên liên kết cấu trúc dữ liệu?

struct MixedData 
{ 
    char Data1; 
    short Data2; 
    int Data3; 
    char Data4; 
}; 



struct MixedData /* After compilation in 32-bit x86 machine */ 
{ 
    char Data1; /* 1 byte */ 
    /* 1 byte for the following 'short' to be aligned on a 2 byte boundary 
assuming that the address where structure begins is an even number */ 
    char Padding1[1]; 
    short Data2; /* 2 bytes */ 
    int Data3; /* 4 bytes - largest structure member */ 
    char Data4; /* 1 byte */ 
    char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */ 
}; 

sự (thực tế) Vì lý do đó sự liên kết cần được bảo tồn là gì?

+0

bản sao có thể có của [Tại sao không C++ làm cho cấu trúc chặt hơn?] (Http://stackoverflow.com/questions/6730664/why-doesnt-c-make-the-structure-tighter) –

+2

Tham khảo liên kết này. Nó sẽ giúp bạn hiểu cách căn chỉnh giúp truy cập nhanh có thể. http://www.geeksforgeeks.org/archives/9705 –

Trả lời

8

Đọc và ghi không được ký hiệu thường yêu cầu CPU tìm nạp hai từ liền kề từ bộ nhớ (thay vì chỉ một) và áp dụng một số phép cộng bitwise bổ sung để thực hiện thao tác được chỉ định đúng cách.

Một số kiến ​​trúc, như x86 sẽ cho phép chi phí hiệu suất. Các kiến ​​trúc khác (đáng chú ý nhất là ARM), hoặc sẽ đưa ra một ngoại lệ (thường dẫn đến một tín hiệu SIGBUS cho một quá trình người dùng) hoặc thậm chí "vòng" địa chỉ đến ranh giới gần nhất có thể dẫn đến một số lỗi rất khó chịu.

+2

Hơn nữa, và quan trọng đối với lập trình đồng thời, truy cập không được ký hiệu không thể được thực hiện nguyên tử, trong khi liên kết một có thể. –

9

Trên nhiều kiến ​​trúc, sắp xếp lần đọc và ghi từ và đến bộ nhớ chính nhanh hơn nhiều so với các đối tác không được ký hiệu của chúng.

+9

Và trên một số, truy cập không được ký hiệu bị cấm. – osgx

+4

trên một số kiến ​​trúc thậm chí sẽ dẫn đến ngoại lệ nếu trình biên dịch không tạo mã để làm việc xung quanh đọc/ghi – mensi

+2

Trên hầu hết các kiến ​​trúc, một truy cập kéo dài hai trang sẽ dẫn đến ngoại lệ MMU và xử lý một trường hợp như vậy . Một trình biên dịch mà không có sự đảm bảo liên kết thì không thể tạo ra hạt nhân mà không có nhiều nỗ lực lập trình viên. – Potatoswatter

2

Thông thường, cấu trúc được căn chỉnh trên một liên kết phụ thuộc bộ xử lý để truy cập chúng nhanh nhất có thể bằng cách sử dụng kích thước đăng ký 'tự nhiên' của bộ xử lý.

Đối với bộ vi xử lý 32 bit, đó là 4 byte (hoặc 32 bit), đối với bộ xử lý 64 bit là 8 byte.

Một số bộ vi xử lý (không phải x86) sẽ tạo ra lỗi nếu bạn cố gắng truy cập (nói) một int nếu nó không được căn chỉnh đúng ranh giới.

Giao tiếp giữa các thiết bị khác nhau là một lý do thực tế để duy trì sự liên kết. Với sự liên kết mặc định, cấu trúc này sẽ dài 24 byte, trong khi trên một bộ xử lý 64 bit, nó sẽ là 48 byte, và không phải của các mục ngoại trừ đầu tiên sẽ ở cùng một vị trí. Có thể thay đổi cấu trúc đệm bằng chỉ thị trình biên dịch/pragma có thể làm mất đi nhu cầu về padding thủ công được chỉ định trong ví dụ của bạn, nhưng điều này thường khác nhau đối với mỗi trình biên dịch.

Các vấn đề liên quan