2013-04-05 39 views
11

Tôi đang đọc N3485 C++ Dự thảo Tiêu chuẩn và trong phần nói về sự liên kết, nó khẳng định như sau:C++ liên kết - nghiêm ngặt và yếu

3.11 Alignment [basic.align]

1. .. Căn chỉnh là giá trị số nguyên được xác định thực hiện đại diện cho số số byte giữa các địa chỉ kế tiếp mà tại đó một đối tượng nhất định có thể được cấp phát. Một kiểu đối tượng áp đặt một yêu cầu căn chỉnh trên mọi đối tượng thuộc loại đó; liên kết chặt chẽ hơn có thể được yêu cầu bằng cách sử dụng thông số liên kết (7.6.2).

Ở đây nó nêu rõ sự liên kết là gì và tôi hiểu điều đó. Nó có nghĩa là nếu bạn có 32 bit (4byte) hệ thống, nó sẽ đọc trong 4 byte kích thước khối tại một thời điểm, vì vậy bạn nên đặt những thứ trong bộ nhớ tại địa chỉ offset 4 byte. Rất nhiều điều này được xử lý bởi một trình biên dịch tốt, tuy nhiên C++ cho phép bạn có tiếng nói của bạn trong nó quá.

Trình chỉnh sửa căn chỉnh mà nó nói là alignas.

Bạn có thể vượt qua một số nguyên để alignas để xác định yêu cầu liên kết của bạn hoặc một loại như alignas(double)

Bây giờ, bạn đã yếu hoặc nghiêm ngặt liên kết, mà được ghi nhận là như sau:

5 sắp xếp có đơn đặt hàng từ trở nên yếu hơn hoặc mạnh hơn hoặc hẹp hơn sắp xếp. Sắp xếp chặt chẽ hơn có giá trị căn chỉnh lớn hơn. Địa chỉ đáp ứng yêu cầu căn chỉnh cũng đáp ứng mọi yêu cầu căn chỉnh hợp lệ yếu hơn .

7 sắp xếp So sánh có ý nghĩa và cung cấp kết quả rõ ràng:

- Hai sắp xếp đều bình đẳng khi giá trị số của họ đều bình đẳng.

- Hai sắp xếp khác nhau khi giá trị số của chúng không bằng nhau.

- Khi căn chỉnh lớn hơn một đường khác, nó phù hợp với một liên kết chặt chẽ hơn.

Vì vậy, ở đây nó cho biết rằng căn chỉnh chặt chẽ hơn là căn chỉnh lớn hơn. Điều đó có nghĩa là alignas(8) nghiêm ngặt hơn alignas(4)? Trên một hệ thống 32 bit (4 byte), phiên bản 8 có nghĩa là loại int sẽ yêu cầu hai lần đọc thay vì một, và một với chỉ đệm. Là nghiêm ngặt đề cập đến thực tế là nó áp đặt phí tiềm năng trên CPU, khi liên kết là "lạm dụng", như trong ví dụ ngớ ngẩn này?

Tôi nhận thấy rằng không phải tất cả các sắp xếp đều hợp lệ trên một hệ thống nhất định và các sắp xếp mở rộng phải hợp lệ để tạo ra hành vi đúng.

Để căn chỉnh cho tôi sắp cho phép dữ liệu bộ nhớ truy cập CPU trong khối kích thước từ, đó là cách tối ưu nhất để CPU lấy và ghi dữ liệu vào và ra khỏi bộ nhớ.

Sự liên kết chặt chẽ này, như tôi hiểu, có khả năng có thể làm hỏng điều đó. Liệu tôi có sai? Sự liên kết chặt chẽ với sự liên kết yếu là gì?

Trả lời

8

"nghiêm ngặt" chỉ đề cập đến thực tế là các giá trị căn chỉnh lớn hơn có nhiều hạn chế hơn về các địa chỉ có thể.

Chỉ có một nửa số địa chỉ hợp lệ cho căn chỉnh 8 vì có liên kết 4, do đó, loại có căn chỉnh 8 bị hạn chế hơn về vị trí đặt nó.

+0

ah! Điều đó có ý nghĩa. –

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