2010-08-19 32 views
13

Tệp thi hành của tôi có kích thước 364KB. Nó không sử dụng một lớp Vector2D vì vậy tôi đã triển khai một lớp với các toán tử quá tải.Điều gì làm cho kích thước của EXE phát triển?

tôi đã thay đổi hầu hết mã của tôi từ

point.x = point2.x; 
point.y = point2.y; 

để

point = point2; 

Điều này dẫn đến việc loại bỏ gần 1/3 dòng của tôi về mã và chưa exe của tôi vẫn là 364KB. Điều gì chính xác làm cho nó phát triển về kích thước?

+1

Tại sao nó ít hơn? 'point = point2' đang thực hiện công việc giống hệt như trước (bên trong toán tử), chỉ với một giao diện khác. – GManNickG

+1

@GMan: đó là lý do tại sao anh ấy hỏi câu hỏi này ... có lẽ anh ấy tin rằng exe đã tăng kích thước dựa trên các dòng mã. –

+4

Im sẽ upvote này chỉ đơn giản là cho thực tế rằng đây là một câu hỏi thực sự tốt mà rất nhiều người hỏi khi bắt đầu lập trình của họ. –

Trả lời

9

Điều gì làm cho EXE phát triển về kích thước?

Thư viện bên ngoài, đặc biệt là thư viện tĩnh và thông tin gỡ lỗi, tổng kích thước mã, thư viện thời gian chạy của bạn. Nhiều mã hơn, nhiều thư viện hơn == exe lớn hơn.

Để giảm kích thước của exe, bạn cần xử lý exe với tiện ích gnu strip, loại bỏ tất cả thư viện tĩnh, loại bỏ thư viện thời gian chạy C/C++, tắt tất cả kiểm tra thời gian chạy và bật tối ưu hóa kích thước trình biên dịch. Làm việc không có CRT là một nỗi đau, nhưng điều đó là có thể. Ngoài ra còn có thư viện wcrt (thay thế thời gian chạy C) được tạo để tạo các ứng dụng nhỏ (bằng cách này, nó chưa được cập nhật/duy trì trong 5 năm qua).

Ví dụ nhỏ nhất mà tôi có thể tạo bằng trình biên dịch msvc là khoảng 16 kilobyte. Đây là một ứng dụng cửa sổ hiển thị cửa sổ đơn và yêu cầu msvcrt.dll để chạy. Tôi đã sửa đổi nó một chút, và biến nó thành trò đùa thực tế mà lau hình ảnh trên màn hình.

Để biết các kỹ thuật giảm kích thước exe ấn tượng, bạn có thể muốn xem .kkrieger. Nó là một game bắn súng góc nhìn người thứ nhất 3D, tổng cộng 96 kilobyte. Trò chơi có một cấp độ lớn và chi tiết, hỗ trợ trình đổ bóng, bóng thời gian thực, v.v. so sánh với Saurbraten (xem screenshots). Ứng dụng cửa sổ làm việc nhỏ nhất (bản demo 3D với âm nhạc) mà tôi từng gặp là 4 kilobyte lớn và sử dụng các kỹ thuật nén và (có thể) các tính năng không có giấy tờ (tức là thực tế * .com executbale có thể giải nén và khởi động win32 exe trên windows xp) ..

Trong hầu hết các trường hợp, kích thước * .exe không thực sự làm phiền bạn (tôi chưa thấy đĩa mềm trong vài năm), miễn là nó là hợp lý (dưới 100 megabyte). Ví dụ về kích thước tập tin "không hợp lý" xem gỡ lỗi xây dựng của Qt 4 cho mingw.

Điều này dẫn đến việc xóa gần 1/3 dòng mã của tôi nhưng số tiền của tôi vẫn là 364KB.

Rất có thể do thư viện bên ngoài sử dụng bởi trình biên dịch, kiểm tra thời gian chạy, v.v. Ngoài ra, đây là thao tác gán. Nếu bạn không sử dụng kiểu tùy chỉnh cho x (với hàm tạo bản sao), thao tác "sao chép" rất có khả năng dẫn đến số lượng thao tác nhỏ - tức là xóa 1/3 dòng không đảm bảo mã của bạn sẽ bằng 1/3 ngắn hơn.

Nếu bạn muốn xem mức độ ảnh hưởng của sửa đổi, bạn có thể "yêu cầu" trình biên dịch tạo danh sách asm cho cả hai phiên bản của chương trình rồi so sánh kết quả (thủ công hoặc bằng cách khác). Hoặc bạn có thể bỏ qua/so sánh cả hai phiên bản thực thi. BUt Tôi chắc chắn rằng bằng cách sử dụng dải GNU hoặc loại bỏ các thư viện bổ sung sẽ có tác dụng nhiều hơn loại bỏ các toán tử gán.

6

Loại điểm là gì? Nếu nó là hai phao nổi, thì trình biên dịch sẽ ngầm làm một bản sao thành viên-by-thành viên, đó là điều tương tự bạn đã làm trước đây.

CHỈNH SỬA: Dường như một số người trong đám đông ngày nay không hiểu câu trả lời này và được đền bù bằng cách giảm giá. Vì vậy, hãy để tôi giải thích:

Các dòng mã KHÔNG có liên quan đến kích thước thực thi. Mã nguồn cho trình biên dịch biết dây chuyền lắp ráp nào được tạo ra. Một dòng mã có thể gây ra hàng trăm nếu không phải hàng ngàn hướng dẫn lắp ráp. Điều này đặc biệt đúng trong C++, trong đó một dòng có thể gây ra việc xây dựng đối tượng ẩn, hủy, sao chép, v.v.

Trong trường hợp này, tôi cho rằng "điểm" là một lớp với hai phao, vì vậy sử dụng toán tử gán thực hiện một bản sao thành viên theo từng thành viên, tức là mỗi thành viên sẽ mất riêng và sao chép nó. Đó là chính xác cùng một điều ông đã làm trước đây, ngoại trừ việc bây giờ nó được thực hiện hoàn toàn. Các kết quả lắp ráp (và do đó kích thước thực thi) là như nhau.

+0

Ai bỏ phiếu mà không có bình luận? Có chuyện gì thế? – EboMike

+0

+1 cho phiếu giảm giá mà không có bình luận, không phải là mát mẻ! –

+0

Tôi đã bỏ phiếu vì nó không trả lời câu hỏi. –

4

Các tệp thi hành thường có kích thước lớn nhất trong 'trang' thay vì byte riêng biệt.

+0

sẽ downvoter xin vui lòng để lại một bình luận. Cảm ơn. –

+0

"sẽ downvoter" Cùng một điều. Câu trả lời không giải quyết "những gì làm cho exe phát triển về kích thước". Trang hay không, thông thường có thể giảm kích thước thực thi 300 kb trở lên. – SigTerm

+0

Câu trả lời cho câu hỏi: việc xóa một vài dòng mã có thể không đủ để thu nhỏ bên dưới kích thước trang tiếp theo thấp hơn. –

1

Khi bạn biên dịch chương trình c hoặc C++ thành tệp thực thi, trình biên dịch dịch mã của bạn thành mã máy và áp dụng tối ưu hóa khi thấy phù hợp. Nhưng đơn giản, mã hơn = nhiều mã máy hơn để tạo = kích thước lớn hơn cho tệp thực thi.

11

Trình biên dịch có thể đã tối ưu hóa quá tải nhà điều hành của bạn bằng cách nội tuyến nó. Vì vậy, nó có hiệu quả biên dịch cho cùng một mã như ví dụ ban đầu của bạn sẽ. Vì vậy, bạn có thể đã cắt giảm rất nhiều dòng mã bằng cách quá tải toán tử gán, nhưng khi trình biên dịch inline, nó lấy nội dung của toán tử gán của bạn và gắn nó inline tại điểm gọi.

Nội tuyến là một trong những cách mà tệp thực thi có thể phát triển về kích thước. Nó không phải là cách duy nhất, như bạn có thể thấy trong các câu trả lời khác.

+0

Woah, wtf? Bỏ phiếu? Tại sao? – Anthony

+0

"Tại sao?" Vì câu trả lời của bạn không giải quyết được "Điều gì khiến cho EXE phát triển về kích thước?" phần. – SigTerm

+0

@ SigTerm: Tốt hơn? – Anthony

2

Một số liên kết để xem xét

http://www2.research.att.com/~bs/bs_faq.html#Hello-world

GCC C++ "Hello World" program -> .exe is 500kb big when compiled on Windows. How can I reduce its size?

http://www.catch22.net/tuts/minexe

Đối với Windows, nhiều lựa chọn trình biên dịch trong VC++ có thể được kích hoạt như RTTI, xử lý ngoại lệ, kiểm tra bộ đệm, v.v. có thể thêm nhiều hậu trường hơn vào kích thước tổng thể.

3

Tôi nghĩ rằng đây là một ví dụ tốt lý do tại sao người ta không nên lo lắng quá nhiều về mã đang quá tiết nếu bạn có một trình biên dịch tối ưu hóa tốt. Thay vào đó, luôn mã hóa rõ ràng để các lập trình viên đồng nghiệp có thể đọc mã của bạn và để tối ưu hóa cho trình biên dịch.

0

Ngoài ra, hãy kiểm tra xem bạn có nhiều đối tượng tĩnh/toàn cầu hay không. Điều này làm tăng đáng kể kích thước exe của bạn nếu chúng không được khởi tạo.

Ví dụ:

int temp[100] = {0}; 
int main() 
{ 

} 

kích thước của chương trình trên là 9140 byte trên máy linux của tôi.

nếu tôi khởi tạo mảng tạm thời thành 5, thì kích thước sẽ tăng khoảng 400 byte. Kích thước của chương trình dưới đây trên máy linux của tôi là 9588.

int temp[100] = {5}; 
int main() 
{ 

} 

Điều này là do, không có đối tượng toàn cầu được khởi tạo vào phân đoạn .bss, không được khởi tạo cùng một lúc trong khi khởi động chương trình. Trong trường hợp nội dung của đối tượng được khởi tạo không phải 0 sẽ được nhúng vào chính bản thân exe.

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