2013-04-03 36 views
5

Một số lần khi lập trình chúng ta xác định hoặc khai báo hàm, định nghĩa, biến, macro và cấu trúc dữ liệu. nhưng không bao giờ sử dụng chúng sau đó.Các trình biên dịch loại bỏ các chức năng, định nghĩa, biến, macro, bao gồm vv

  1. Các tài nguyên không sử dụng này sẽ tự động xóa bởi trình biên dịch (trình biên dịch hiện đại có khả năng tối ưu hóa)?
  2. Có cách nào để nhận ra chúng không?
+0

GCC luôn ném cảnh báo biến không sử dụng với '-Wall', vì vậy tôi sẽ tưởng tượng như vậy. Các macro – Blender

+2

không liên quan, nhưng hãy xem http://stackoverflow.com/q/6215782/390913 – perreal

Trả lời

8

Phụ thuộc:

Macro được chuyển đổi thành văn bản chương trình bởi trình biên dịch. Họ không đại diện cho bất kỳ điều gì khác ngoài văn bản thay thế chúng, và không sống ngoài thời gian biên dịch (trừ khi ... xem bên dưới).

Biến địa phương và các biến này có thể bị xóa, nếu chúng không có một hàm tạo hoặc trình phá hủy không tầm thường. (Bạn không muốn cái gì đó như scoped_lock loại bỏ chỉ vì bạn không tham khảo nó sau này trong các mã.) Điều này cũng giữ cho các biến và chức năng với liên kết nội bộ (ví dụ như quy định tại namespace phạm vi với từ khóa static). Tuy nhiên, trong hầu hết các trường hợp, các tài nguyên cần thiết cho các đối tượng đó là tối thiểu và khoản tiết kiệm không đáng kể.

Các chức năng có một chút khác biệt và phụ thuộc. Một hàm ảo nói chung sẽ được coi là "đã sử dụng" nếu có một cá thể thuộc loại của nó và hầu như chắc chắn sẽ có mặt, ngay cả khi nó không bao giờ được gọi.

Ngoài điều đó (và điều này cũng áp dụng cho các biến toàn cục): đó là tối đa liên kết. Mức độ chi tiết của hầu hết các liên kết là đối tượng tệp kết quả từ việc biên dịch "đơn vị dịch": rằng tệp đối tượng là hoặc không phải là một phần của chương trình của bạn. Nếu bạn yêu cầu trình liên kết kết hợp tệp đối tượng, thì bạn nên tải mọi thứ trong đó. Nếu bạn đặt tệp đối tượng trong thư viện một (tĩnh) và yêu cầu trình liên kết sử dụng, thì liên kết sẽ kết hợp tệp đối tượng vào chương trình của bạn nếu và chỉ nếu nó giải quyết bên ngoài chưa được giải quyết. Nhưng nếu nó kết hợp tệp đối tượng, nó thường sẽ kết hợp tất cả của nó. (Bất kỳ thư viện nào cũng sẽ đặt từng hàm không phải ảo vào một tệp đối tượng riêng biệt, do đó bạn không nhận được nhiều hơn mức bạn cần.)

Về vấn đề này, DLL hoạt động như tệp đối tượng (mặc dù tên ). Nếu bạn liên kết các tập tin đối tượng của bạn vào một DLL, chương trình sử dụng nó sẽ nhận được tất cả các DLL, hoặc không có.

Cuối cùng: mặc dù không phải là một phần của chương trình của bạn, các tệp đối tượng và thực thi cuối cùng sẽ thường chứa thông tin tượng trưng; các hệ thống tốt nhất thậm chí sẽ duy trì thông tin liên quan đến các macro , để trình gỡ lỗi có thể hiển thị mọi thứ theo cách bạn đã viết chúng. (Làm thế nào đến nay nó có thể làm điều này với các macro là gây tranh cãi.)

4

Nếu trình biên dịch hoặc trình liên kết có thể thấy rằng không có tham chiếu đến hàm C hoặc biến C, chúng có thể (và thường làm) loại bỏ những thứ không sử dụng.

Các định nghĩa macro không được sử dụng không làm cho nó trở thành mã được biên dịch. Và cùng một nắm giữ cho typedefs và muốn.

Tuy nhiên, khó loại bỏ mã và dữ liệu không được sử dụng được triển khai trong các phần lắp ráp của chương trình.

Và không phải lúc nào cũng rõ ràng đối với trình biên dịch nếu một số biến được tham chiếu hoặc một số mã sẽ được sử dụng hoặc thực thi.

Vì vậy, vâng, những ngày này, hầu hết các nội dung không sử dụng rõ ràng sẽ bị xóa.

+1

Macro phụ thuộc vào các nội dung không sử dụng. Bất cứ điều gì ở phạm vi toàn cầu (và bao gồm hầu hết các chức năng) chỉ có thể được xóa bởi trình liên kết và mức độ chi tiết của hầu hết các trình liên kết là tệp đối tượng, vì vậy ngay sau khi tệp đối tượng được tích hợp vào chương trình của bạn, bạn sẽ có mọi thứ trong đó . Thông thường, tất cả những gì sẽ bị loại bỏ là các biến cục bộ và như vậy; những thứ không đòi hỏi nhiều tài nguyên. –

+0

@JamesKanze Tôi đã đề cập đến các liên kết. Mức độ chi tiết không phải là một tệp đối tượng đơn lẻ (đơn vị dịch). –

+1

Nó không phải là, nhưng nó hầu như luôn luôn là. Trong thực tế, có một lý do tại sao các lập trình viên có kinh nghiệm có khuynh hướng đặt từng hàm vào một tệp nguồn riêng khi xây dựng mã thư viện. –

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