2013-02-05 17 views
8

Tôi đang làm việc trên bộ xử lý được nhúng nên kích thước nhị phân rất quan trọng. Tôi đang cố gắng tránh sử dụng thư viện chuẩn. Tôi muốn sử dụng std :: function, tuy nhiên. Tôi trích xuất "function.hpp" từ tăng, và tôi đang cố gắng sử dụng nó, nhưng chỉ đơn giản là bao gồm function.hpp tăng kích thước của 200k nhị phân của tôi, mà làm cho nó lớn hơn bộ vi xử lý của tôi có thể chấp nhận. Nếu tôi bao gồm thư viện chuẩn, nó chỉ tăng 60k nhị phân của tôi. Tôi không thể hình dung ra, nếu tôi không sử dụng bất kỳ mẫu nào, không nên có bất kỳ chi phí nào. Và ngay cả khi tôi làm thế, tôi không thể tưởng tượng được giá trị của nó là 200k. Tôi đang sử dụng gcc 4.7, và tôi đã vô hiệu hoá thông tin gỡ lỗi từ những gì tôi có thể nói "-g0" và bật tối ưu hóa "-O2".Bao gồm chức năng tăng cường.hpp, không sử dụng nó, làm tăng kích thước của tệp nhị phân của tôi lên 200k. Tại sao?

Mọi trợ giúp sẽ được đánh giá cao.

+0

Tối ưu hóa nhiều hơn với '-O3'? (hoặc '-Os' cho kích thước) – Cornstalks

+1

@Cornstalks Đó chính xác là điều sai trái để làm. '-O3' cho phép tối ưu hóa có thể * tăng * kích thước nhị phân. Dù bằng cách nào, tôi không nghĩ rằng điều này có liên quan đến tối ưu hóa, tôi nghĩ rằng bao gồm cả tiêu đề tăng làm cho trình biên dịch kéo trong xử lý ngoại lệ vào chương trình của bạn trong khi bạn không sử dụng chúng theo cách khác. Bạn đang biên dịch hệ thống/bộ xử lý nào? – us2012

+0

'-Os' cạo một vài kb, (cảm ơn cho tip) nhưng không đủ để quan trọng. Biên dịch không có ngoại lệ, '-fno-exceptions' thay đổi kích thước 5k và thêm hỗ trợ ngoại lệ, thêm lại 5k. Vẫn không có ý nghĩa. Tôi đang biên soạn cho ARM Cortex m3. Điều kỳ lạ khác là tôi có thể sử dụng hàm std :: từ thư viện chuẩn, thực sự sử dụng nó trong mã, không chỉ bao gồm nó và nó chỉ thêm 60k. Bạn con số đó sẽ biên dịch trong cùng một ngoại lệ xử lý mà tăng sẽ. –

Trả lời

2

GCC bao gồm một số thông tin biểu tượng vào nhị phân đã biên dịch ngay cả khi bạn sử dụng -g0. Để thực sự loại bỏ tất cả các ký hiệu, bạn nên sử dụng tùy chọn dòng lệnh --strip-all cho trình liên kết.

Ngoài ra, do kích thước của tệp thực thi là quan trọng đối với bạn, hãy xem xét -fdata-sections-ffunction-sections cho trình biên dịch và --gc-sections cho trình liên kết.

+0

Cảm ơn, tôi đã sử dụng các tùy chọn đó.Lời khuyên tốt mặc dù. –