Tôi đã dành một vài phút sắp xếp lại các trường theo cách thủ công trong cấu trúc để giảm hiệu ứng đệm [1], cảm giác như một vài phút quá nhiều. Cảm giác ruột của tôi nói rằng thời gian của tôi có lẽ tốt hơn nên viết một kịch bản Perl hoặc không nên làm loại tối ưu hóa này cho tôi.Tự động sắp xếp lại trường trong các cấu trúc C để tránh đệm
Câu hỏi của tôi là liệu điều này có quá thừa hay không; đã có một số công cụ mà tôi không nhận thức được, hoặc một số tính năng biên dịch mà tôi sẽ có thể bật [2] để đóng gói cấu trúc?
Vấn đề thậm chí còn phức tạp hơn vì thực tế điều này cần phải được tối ưu hóa liên tục trên một vài kiến trúc khác nhau, vì vậy bất cứ công cụ nào cũng cần có khả năng tính toán các cấu trúc và kích cỡ con trỏ khác nhau.
EDIT: Làm rõ nhanh - những gì tôi muốn làm là sắp xếp lại trường trong mã nguồn để tránh đệm, không "đóng gói" cấu trúc như được biên dịch mà không có đệm.
EDIT # 2: Một biến chứng khác: tùy thuộc vào cấu hình, kích thước của một số loại dữ liệu cũng có thể thay đổi. Những cái rõ ràng là con trỏ và con trỏ khác biệt cho các kiến trúc khác nhau, nhưng cũng có các loại dấu phẩy động (16, 32 hoặc 64 bit tùy thuộc vào độ chính xác), tổng kiểm tra (8 hoặc 16 bit tùy thuộc vào 'tốc độ') và một số những thứ không rõ ràng khác.
ngàn [1] struct trong câu hỏi là instantiated lần trên một thiết bị nhúng, vì vậy mỗi giảm 4-byte của struct có thể có nghĩa là sự khác biệt giữa một đi và không-go cho dự án này.
[2] Trình biên dịch có sẵn là GCC 3. * và 4. *, Visual Studio, TCC, ARM ADS 1.2, RVCT 3. * và một số ít người khác mơ hồ hơn.
Do các trường hợp cần struct này là di động trên các thiết bị, hoặc là nó OK cho mỗi kiến trúc để có bao bì riêng của mình? – Alnitak
Chỉ cần một sang một bên: Tôi nghĩ rằng đây là một vấn đề thú vị, và googled "perl struct sắp xếp lại". Đây là kết quả hàng đầu. Câu hỏi chỉ mới 15 phút! –
Alnitak - Vâng, đây thực sự là mã cần phải cực kỳ dễ dàng :) Mỗi kiến trúc đều có định nghĩa riêng về cấu trúc - nhưng không thực tế khi viết các định nghĩa theo kiến trúc cụ thể bằng tay. – Christoffer