Tôi nghĩ rằng nhiều công cụ phân tích tĩnh có thể không cung cấp cho bạn những gì bạn cần. được kéo vào bởi các tiêu đề được biên dịch sẵn) và các đặc tính tạo mã của trình biên dịch.
Tôi đã gặp phải sự cố tương tự trong quá khứ, với tệp thực thi lớn có kích thước bị chi phối bởi một thư viện cụ thể. Cách tôi nhận được để dưới cùng của nó chỉ đơn giản là để xem kích thước của các tập tin đối tượng cho mỗi .cpp. Điều đó sẽ không cung cấp cho bạn những câu chuyện đầy đủ như là mối liên kết sẽ tối ưu hóa phần không sử dụng (mặc dù nó có giá trị kiểm tra bạn đã có tùy chọn thiết lập - /OPT:REF
cho Visual Studio). Nó sẽ mặc dù cho phép bạn tập trung tìm kiếm của bạn. Tìm hai hoặc ba tệp đối tượng lớn nhất và sau đó xem các tệp .cpp tương ứng. Sau đó, bạn có hai tùy chọn - viết một kịch bản có đầu ra là objdump
(VisualStudio) hoặc nm -C
(gcc), nơi bạn có thể trích xuất bù của từng chức năng trong mô-đun, để bạn có thể phân biệt chúng với ý tưởng trước đó kích thước của từng chức năng.
Hoặc phương pháp đơn giản nhất là sử dụng tìm kiếm nhị phân trên tệp cpp. # definexóa tất cả các mã sau khi kết thúC#includes và biên dịch nó. Điều đó sẽ cung cấp cho bạn một ý tưởng về chi phí bao gồm (nếu chính nó là rất lớn, sau đó bạn có thể đi sâu vào các vùi tiêu đề để tìm thấy những đóng góp nhiều nhất). Tiếp theo, vô hiệu hóa mỗi nửa mã bằng #ifdef và tìm một nửa là số lớn hơn. Sử dụng phương pháp này bạn có thể nhanh chóng tìm thấy các chức năng đóng góp nhiều nhất vào kích thước của thư viện.
Trong trường hợp thư viện mà tôi có cùng vấn đề này, nguyên nhân hóa ra là một chức năng khuôn mẫu rất lớn được khởi tạo mỗi lần biến thành viên được lưu. Giải pháp trong trường hợp đó là làm cho hàm bê tông sao cho tất cả các mã không yêu cầu hành vi kiểu cụ thể chỉ được khởi tạo một lần và các hàm mẫu được bản địa hóa cho các bit logic là kiểu cụ thể.
Nguồn
2012-07-30 08:37:36
Tôi nghi ngờ nếu điều này là có thể với các công cụ hiện tại. – iammilind
Clang cung cấp cơ sở hạ tầng gọn gàng để viết các công cụ cấp nguồn khác nhau. Bạn có thể sử dụng nó để phát triển công cụ của riêng bạn. – arrowd
nó sẽ thay đổi nếu bạn đang sử dụng tối ưu hóa – Zaffy