2012-03-27 37 views
8

Tiêu chuẩn C không cho phép tối ưu hóa cấu trúc nhất định: ví dụ, sắp xếp lại các trường, hợp nhất trường, loại bỏ các trường không bao giờ đọc, kéo các trường ra khỏi cấu trúc nếu chúng có thể được biến thành các biến tự động , vv Điều này là cần thiết vì nhiều lý do, bao gồm bố cục cấu trúc nhất quán trên các đơn vị biên dịch và cho phép các cấu trúc tương thích với dàn diễn viên.C tối ưu hóa cấu trúc trình biên dịch

Thực hiện bất kỳ tiện ích bổ sung hiện đại nào (ví dụ: gcc, clang, Visual C) có hỗ trợ tiện ích mở rộng cho phép tôi nói rằng nó không được thực hiện các tối ưu hóa này?

Một cách tự nhiên, chúng chỉ có ý nghĩa đối với các định nghĩa là cục bộ đối với một đơn vị biên dịch đơn, để trình biên dịch có thể thấy tất cả các cách sử dụng có thể có của cấu trúc; và một số thứ nhất định (như định nghĩa cấu trúc tương thích với dàn diễn viên) sẽ trở nên không sử dụng được. Nhưng đối với một số nhiệm vụ, đây có thể là một tối ưu hóa rất có giá trị.

Tôi biết rằng gcc sử dụng để có tùy chọn -fipa-struct-reorg để cho phép chính xác điều này, nhưng nó không bao giờ hoạt động rất tốt và bị rách, và cuối cùng đã bị loại bỏ. Nhưng tôi không biết nếu nó được thay thế bằng bất cứ thứ gì. Và tôi đã không thể tìm thấy bất cứ điều gì trong tiếng kêu vang, điều đó làm tôi ngạc nhiên bởi vì tôi nghĩ rằng đây chính xác là loại tối ưu mà clang sẽ là tất cả ...

+0

Sẽ -flto có thể tối ưu hóa những thứ như thế này? –

+1

nó * có thể * giúp đỡ nếu bạn cung cấp cho các biến struct lớp lưu trữ 'register', mà thi hành rằng bạn không dựa vào bố trí bộ nhớ ở một mức độ ngôn ngữ; tuy nhiên, trình tối ưu hóa có thể tìm ra điều đó bất kể sự hiện diện của 'đăng ký', và tôi không biết liệu nó có khác biệt gì trong thực tế hay không ... – Christoph

+0

Không hoạt động, thật không may, nhưng đáng thử --- ta. ('register' không hợp lệ trên cấu trúc thành viên hoặc biến tĩnh, và dường như bị bỏ qua trên biến tự động.) –

Trả lời

4

No. Không có lý do gì cho một điều cần được cung cấp.

  1. Bạn không thể làm điều đó nơi địa chỉ của cấu trúc được lấy và gửi đi bất cứ đâu, vì nó có thể được đặt bí danh. Đó là khá nhiều quy tắc ra bất cứ điều gì bên ngoài của một chức năng duy nhất.

  2. Nếu bạn có thể thực hiện và phân tích yêu cầu để gắn cờ cấu trúc thành viên "điều này có thể được tối ưu hóa nếu không được sử dụng" (hãy cẩn thận tính toán bù trừ macro) sau đó bạn có thể xem cho mình nếu cần thiết hay không, và lấy nó ra.

  3. Nếu không chắc chắn, chỉ cần nhận xét và xem bạn có gặp phải lỗi biên dịch hay không.

+0

Vâng, chắc chắn, nhưng điều này không thực sự có liên quan --- Tôi không hỏi về phân tích tĩnh và, như tôi đã nói trong câu hỏi ban đầu, tôi khá chuẩn bị để tránh những tình huống mà việc tối ưu hóa cấu trúc sẽ phá vỡ mã. –

+1

@DavidGiven, tôi đang cố gắng nghĩ về một trường hợp sử dụng cho tính năng này. Câu trả lời của tôi, về cơ bản, là không có một, đó là lý do tại sao nó không được cung cấp. Nếu bạn có, hãy thêm nó vào câu hỏi. – Ben

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