2010-03-13 21 views
10

Tôi đang nghiên cứu cấu trúc; một số cuốn sách khuyên tạo cấu trúc nếu nó có kích thước mẫu nhỏ hơn 16 byte.Tại sao cấu trúc tốt hơn với ít hơn 16 byte

Tại sao?

Cảm ơn bạn đã trả lời.

+0

trùng lặp của http://stackoverflow.com/questions/1082311/why-should-a-net-struct-be-less-than-16-bytes –

+0

Cũng là một phần của http://stackoverflow.com/questions/2407691/c-struct-design-why-16-byte-được-khuyến nghị-size/2407869 # 2407869 – slugster

Trả lời

28

Đó là vì 16 byte là ngưỡng nơi trình biên dịch bắt đầu sao chép cấu trúc dưới dạng khối bộ nhớ thay vì sử dụng một hoặc hai lệnh di chuyển đơn giản.

Trình biên dịch tối ưu hóa việc sao chép cấu trúc khi chúng nhỏ. Một cấu trúc ví dụ 8 byte có thể được sao chép dưới dạng một giá trị 64 bit duy nhất. Cấu trúc là 16 byte có thể là bản sao dưới dạng một hoặc hai giá trị số ít (tùy thuộc vào kiến ​​trúc bộ vi xử lý). Khi cấu trúc lớn hơn 16 byte, trình biên dịch không cố gắng tối ưu hóa di chuyển nữa, và dự phòng là gọi phương thức sao chép một khối bộ nhớ.

(Lưu ý: ngưỡng 16 byte có thể khác nhau tùy theo phiên bản của trình biên dịch, có vẻ như nó thực sự cố gắng tối ưu hóa vượt quá điểm đó trong các phiên bản mới hơn, nhưng mã được tối ưu hóa sẽ vẫn có nhiều hướng dẫn di chuyển để sao chép một tham chiếu đến một đối tượng mà vẫn còn là một hoạt động di chuyển duy nhất)

Edit:.
Dưới đây là kết quả của một thử nghiệm mà tôi đã làm trên 64 bit cấu trúc hệ thống sao chép của tôi nửa tỷ lần:

struct 4 : 272 ms. 
struct 8 : 235 ms. 
struct 16 : 317 ms. 
struct 32 : 625 ms. 
struct 64 : 1280 ms. 
struct 128 : 4659 ms. 
struct 256 : 8020 ms. 

Như bạn thấy, dưới 16 byte thời gian không tuyến tính, mặc dù 16 b ytes là bốn lần nhiều như 4 byte, nó không mất bốn lần lâu hơn. Trên 16 byte thời gian là tuyến tính, do đó tăng gấp đôi kích thước gấp đôi thời gian. Đó là nơi nó sẽ bắt đầu sử dụng nhiều di chuyển. Trên 64 byte có một bước nhảy, nơi mà thời gian đột nhiên tăng gấp bốn lần khi kích thước tăng gấp đôi. Đó là nơi dự phòng sẽ bắt đầu được sử dụng.

+0

bạn mang đến một quan điểm rõ ràng – Ricky

+0

điểm của bạn đến từ đâu? – Ricky

+0

@Ricky: Tôi đã thực hiện một số thử nghiệm trong những năm qua. Tôi đã thêm kết quả thử nghiệm hiện tại ở trên. – Guffa

1

Không chính xác 16 byte, nhưng vì cấu trúc được truyền theo giá trị (được sao chép bất cứ khi nào bạn đưa chúng cho phương thức, gán chúng, v.v.) chúng không được quá lớn. Nếu họ đang có, đi qua các công cụ bằng cách tham khảo là rẻ hơn.

4 năm sau: Tôi đã trả lời câu hỏi này rất ít về .NET (vẫn không biết nhiều về nó). Câu trả lời của Guffa rõ ràng là chính xác hơn khi đối phó với "nhiều hơn hoặc ít hơn 16 byte?", Vì ở kích thước đó một chút sao chép không quan trọng lắm. Câu trả lời của tôi có thể là điều cần lưu ý khi xây dựng các cấu trúc lớn.

+0

Một con trỏ 64 bit vẫn rẻ hơn 128 bit của cấu trúc. Câu trả lời này không thực sự có ý nghĩa nhiều. – slugster

+2

"Một con trỏ 64 bit vẫn rẻ hơn 128 bit của cấu trúc". tại sao bạn nói như vậy? Có được một con trỏ thường có nghĩa là phân bổ đống và thu gom rác thải đắt tiền trên .NET. Viết một con trỏ ngụ ý tạo ra một rào cản viết cũng đắt trên .NET. –

+0

@slugster: Tham chiếu 8 byte có thể được sao chép rẻ hơn cấu trúc 16 byte, nhưng để tham chiếu hữu ích, nó phải xác định đối tượng trên heap. Tạo đối tượng heap với 16 byte dữ liệu và sao chép tham chiếu đến hàng triệu lần có thể rẻ hơn việc sao chép cấu trúc 16 byte một triệu lần, nhưng tạo đối tượng 16 byte, sao chép tham chiếu hai lần và bỏ qua nó đắt hơn nhiều so với việc sao chép cấu trúc 16 byte hai lần (hoặc có thể, cho vấn đề đó, thậm chí hai mươi lần). – supercat

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