9

Tôi có một chương trình C++ khá lớn (~ 11mb exe) được biên dịch theo VS2008 và quan tâm để xem liệu tối ưu hóa toàn bộ chương trình có ảnh hưởng đáng kể đến hiệu năng của nó hay không. Tuy nhiên, việc bật tối ưu hóa toàn bộ chương trình và tạo mã thời gian liên kết làm cho liên kết thất bại như sau;Tối ưu hóa toàn bộ chương trình không thành công trong VC2008

1>c:\cpp\Win32\Atlas\tin\TINDoc.Cpp : fatal error C1083: Cannot open compiler intermediate file: '.\releaseopt\TINDoc.obj': Not enough space 
1>LINK : fatal error LNK1257: code generation failed 

Nhìn vào trình quản lý tác vụ, tôi có thể thấy trình liên kết sử dụng ngày càng nhiều bộ nhớ cho đến khi hết bom. Trình biên dịch đang chạy trên XP 32 bit với tệp 2GB hoặc ram và 2gb. WPO có bị hạn chế đối với các ứng dụng nhỏ hơn và/hoặc môi trường lớn hơn hay không có cách nào để làm cho trình liên kết trở nên tiết kiệm hơn một chút trong việc sử dụng bộ nhớ.

n.b. đã được bật các phần đầu được biên dịch trước, điều này khiến cho quá trình biên dịch thất bại trước khi liên kết và tắt đầu ra của thông tin gỡ lỗi và bất kỳ thứ gì khác có thể lấy thêm tài nguyên. Trợ giúp cho C1083 cho thấy các tệp tiêu đề bị thiếu hoặc xử lý tệp không đầy đủ thay vì thiếu dung lượng.

Chỉnh sửa: Đã làm việc theo VS2010, mặc dù không có tiêu đề biên dịch trước nhưng hiệu suất đạt được không đáng kể. Tôi sẽ để lại tùy chọn này một mình cho đến khi tôi chuyển sang một nền tảng 64bit mạnh mẽ hơn với phiên bản mạnh mẽ hơn của VS2010.

+6

Câu hỏi thú vị. Điều gì về không gian đĩa miễn phí; có lẽ bạn đang chạy thấp? Tôi tìm thấy [lỗi này trên Microsoft Connect] (http://connect.microsoft.com/VisualStudio/feedback/details/581207/visual-studio-2005-sp1-reproducible-linker-error-lkn1257-caused-by-c1083) dường như phù hợp với các triệu chứng của bạn. Các ý kiến ​​nói rằng nó đã được cố định trong VS 2010. Nếu đó là một lựa chọn, bạn có thể thử điều đó. –

+1

Dường như là lỗi tương tự ok. Tôi sẽ thử trên VS2010 khi tôi có cơ hội và đăng kết quả của mình lên. Cảm ơn vì bạn đã phản hồi. BTW, tải dung lượng đĩa trống. –

+2

VC2008 là một con thú dễ vỡ. Trình tối ưu hóa không hoạt động đối với một số trường hợp và có vẻ như bạn có một trường hợp như vậy. –

Trả lời

5

VC2008 là một con thú dễ vỡ. Trình tối ưu hóa không hoạt động đối với một số trường hợp và có vẻ như bạn có thể có một trường hợp như vậy.

Ví dụ về "không làm việc" bao gồm

  • De-tối ưu hóa mã (chậm!)
  • biên dịch hoặc (thường xuyên hơn) mối liên kết bị treo
  • Obscure biên dịch/link thông báo lỗi
  • Mã không đúng thực hiện (điều này hiếm, nhưng không rõ).

Thực ra, nếu bạn nhìn vào một số thủ thuật được các trình tối ưu hóa hiện đại sử dụng, điều này thật tuyệt vời khi nó hoạt động thường xuyên như vậy. Sự phức tạp là khá đáng kinh ngạc.

Phát biểu vấn đề của Shane đặc biệt, một số những điều mà có thể gây ra lỗi lầm của mình:

  1. Chạy ra khỏi tập tin xử lý được sử dụng là một vấn đề lớn trong DOS và phiên bản Windows đầu. Bạn hầu như không bao giờ nhìn thấy nó trong các phiên bản Windows hiện đại. Tôi thậm chí không chắc chắn vẫn còn một giới hạn về xử lý tập tin.

  2. Lỗi trình biên dịch có thể đang thực hiện vòng lặp vô hạn, có nghĩa là không có số lượng tài nguyên nào là đủ.

  3. Tệp đệ quy bao gồm cũng có thể gây ra điều tương tự. Tất cả các tệp bao gồm của bạn có "#pragma once" hoặc "#if !defined(FOO_INCLUDED)" không?

  4. Có thể bạn đã bao gồm tệp TINDoc.obj hai lần trong dự án không?Trình biên dịch 2008 mạnh mẽ đa luồng và có thể có tranh chấp giữa hai chủ đề cố gắng truy cập tệp. Trên thực tế, điều này có thể xảy ra thông qua lỗi trình biên dịch, ngay cả khi bạn chưa bao gồm tệp hai lần.

  5. Nếu chương trình thực sự quá lớn, hãy xem xét chia nhỏ thành một hoặc nhiều tệp DLL và xây dựng nó thành từng phần hoặc chia nhỏ tệp nguồn thành nhiều tệp để biên dịch theo nhiều giai đoạn.

Đừng cho rằng, bởi vì nó nói "không đủ không gian" là lý do. Một số chương trình (bao gồm một số trình biên dịch) sẽ đoán lý do lỗi, thay vì kiểm tra.

Bạn có thể giám sát việc sử dụng bộ nhớ, xử lý, vv sử dụng task manager hoặc perfmon, hoặc (sở thích của tôi) Process Explorer

Tôi đã đăng tải phần đầu tiên về điều này như một bình luận (ở trên) nhưng tôi một làm cho nó một câu trả lời, theo đề nghị của Ben (http://stackoverflow.com/users/587803/ben) - và mở rộng nó một chút.

+0

Bản tóm tắt tốt Michael, tôi sử dụng '#pragma once' trên tất cả các tiêu đề và đang xem biểu đồ tài nguyên để lỗi không gian có vẻ hợp lý. Đó là một cơ sở mã lớn tạo ra ~ 11mb của một exe, với một số lượng hợp lý của bên thứ ba DLLs đã. Tôi đã tối ưu hóa toàn bộ chương trình làm việc bằng cách sử dụng VS2010, và nó không mang lại nhiều cải thiện trong trường hợp của tôi, vì vậy tôi sẽ chỉ để tránh tùy chọn này cho bây giờ. –

3

Bạn có thể thử khởi động XP bằng công tắc /3G để cung cấp cho trình liên kết không gian địa chỉ 3GB. Trong Vista/7, sử dụng BCDEDIT /Set IncreaseUserVa 3072 trong dòng lệnh để có được hiệu ứng tương tự.

Điều này đã khắc phục sự cố khi tạo tệp .ilk cho tôi.

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