2013-03-01 37 views
23

Chỉ cần tò mò, các bộ công cụ GCC hoặc Clang có thực hiện tương đương với identical COMDAT folding (ICF) của MSVC không? Nếu không, có kế hoạch nào không? Tôi dường như không thể tìm thấy bất kỳ liên kết có thẩm quyền nào gần đây về chủ đề này ngoài các thông điệp danh sách gửi thư GCC cũ.GCC (/ Clang): Các chức năng hợp nhất với các lệnh giống nhau (COMDAT folding)

Nếu không, điều này ngụ ý rằng mẫu instantiations trên các loại riêng biệt luôn là hàm riêng biệt trong kết quả nhị phân (trong trường hợp chúng không hoàn toàn được inlined), ngay cả khi chúng tương thích nhị phân, hoặc có cơ chế khác trong- nơi để xử lý này ở một số cấp độ khác?

Ngoài ra, có ai đã tìm thấy ICF tạo sự khác biệt lớn trong việc giảm thiểu kích thước của kết quả thực thi trong thực tế không? Tôi không có bất kỳ dự án MSVC lớn nào tiện dụng để kiểm tra nó. (Tôi đoán nó chỉ thực sự hữu ích nếu bạn tình cờ tạo ra các mẫu trên nhiều loại tương thích với bố cục vtable khác nhau.)

Cuối cùng, là C++ 11 tuân thủ tiêu chuẩn cho hai hàm con trỏ đến các hàm khác nhau để so sánh bằng nhau trong thời gian chạy? This link dường như ngụ ý rằng nó không phải là, nhưng nó cho C99. CHỈNH SỬA: found previous question on this topic

+1

Tìm thấy [trích dẫn từ Larry Osterman của MSFT] (http://blogs.msdn.com/b/oldnewthing/archive/2005/03/22/400373.aspx): "Và tính năng này [ICF] là điều khiến C++ là một giải pháp khả thi cho các ứng dụng ... Nếu không, các mẫu sẽ gây ra sự bùng nổ đầy đủ về kích thước mã mà chúng hầu như không thể sử dụng được cho phần mềm sản xuất. "... tò mò về cách GCC/Clang nhận được nếu họ không làm điều này –

+3

Vâng họ nhận được bởi và rất nhiều phần mềm sử dụng các mẫu trong thư viện chuẩn, vì vậy rõ ràng là không đúng là các mẫu "hầu như không sử dụng được" –

+0

@ JonathanWakely Hah, tôi thích GCC, đó chỉ là trích dẫn của anh ấy :) –

Trả lời

16

Cả GCC lẫn Clang đều không liên kết và ICF cần được thực hiện bởi trình liên kết hoặc ít nhất với sự hợp tác với trình liên kết. Chỉnh sửa: Họ không làm ICF, do đó, có, instantiations riêng biệt sản xuất mã riêng biệt. Trình liên kết GNU gold hỗ trợ ICF với tùy chọn --icf, cần tùy chọn GCC -ffunction-sections để sử dụng.

Các chức năng riêng biệt phải có địa chỉ riêng ... Tôi không thể nhớ ICF có bị vô hiệu hóa đối với bất kỳ chức năng nào có địa chỉ của nó hay không, nhưng nếu không có thể tải các lệnh không có trước khi kết hợp chức năng và làm cho mỗi khởi tạo riêng biệt bắt đầu trên một hướng dẫn khác nhau, vì vậy chúng có địa chỉ khác nhau. Chỉnh sửa: vàng của --icf=safe tùy chọn chỉ cho phép ICF cho các chức năng có thể được chứng minh không có địa chỉ của họ được thực hiện, do đó, mã dựa trên địa chỉ riêng biệt vẫn sẽ làm việc.

ICF là một tối ưu hóa gọn gàng, nhưng không cần thiết. Với một chút nỗ lực, bạn có thể đưa ra mã không phụ thuộc vào một mẫu không phải mẫu hoặc một mẫu có ít thông số hơn, để giảm số lượng mã trùng lặp trong tệp thực thi. Có thêm thông tin về điều này trong các trang trình bày cho một cuộc nói chuyện Diet Templates tôi đã làm một vài năm trước đây.

+0

Xin lỗi, tôi nhận ra rằng tôi hơi lỏng lẻo với các điều khoản ... tôi phải gọi cho người liên kết-cái gì-thường-được đóng gói-với-nhưng-khác biệt-từ-GCC-on-linux-x86/x64? (Đó là nền tảng cụ thể, phải không?) –

+1

Trình liên kết đó thường được gọi là "GNU ld" hoặc trình liên kết GNU, với toàn bộ công cụ thường được gọi là GNU toolchain (nghĩa là GCC, GNU as, GNU ld, và đôi khi bao gồm GNU libc). Liên kết thường là một phần của hệ điều hành, ví dụ:Solaris có trình liên kết riêng, nhưng liên kết GNU là nền tảng chéo, hỗ trợ nhiều định dạng thực thi và chạy trên nhiều hệ điều hành khác nhau, ví dụ GCC trên Solaris có thể được cấu hình để sử dụng trình liên kết Solaris bản địa hoặc trình liên kết GNU. –

+0

cảm ơn bạn đã làm rõ. clang vẫn sử dụng GNU ld theo mặc định, phải không? thực sự, tôi đoán điều đó phụ thuộc vào cấu hình của bạn, có vẻ như họ cũng có của riêng họ. –

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