2011-01-22 29 views
5

Tôi đang tìm cách thoát nhanh C++ đã phân bổ nhiều cấu trúc trong bộ nhớ bằng cách sử dụng các lớp C++. Chương trình đã hoàn thành chính xác, nhưng sau khi "trả lại" cuối cùng trong chương trình, tất cả các chức năng tự động phá hủy. Vấn đề là chương trình đã cấp phát khoảng 15GB bộ nhớ thông qua rất nhiều cấu trúc lớp C++, và quá trình tự động hủy này khoảng 1 giờ nữa để hoàn thành khi nó đi qua tất cả các cấu trúc - mặc dù tôi không quan tâm đến kết quả. Chương trình chỉ mất 1 giờ để hoàn thành nhiệm vụ cho đến thời điểm này. Tôi muốn quay trở lại hệ điều hành và để nó thực hiện việc xóa phân bổ quy trình bán buôn bình thường - điều này rất nhanh. Tôi đã làm điều này bằng cách giết thủ công quá trình trong giai đoạn dọn dẹp - nhưng tôi đang tìm kiếm một giải pháp lập trình tốt hơn.Thoát thành công nhanh chóng từ C++ với nhiều đối tượng được phân bổ

Tôi muốn trả lại thành công cho hệ điều hành nhưng không quan tâm đến bất kỳ nội dung bộ nhớ nào. Chương trình thực hiện rất nhiều phân bổ động/deallocation trong quá trình xử lý bình thường, do đó, nó không chỉ đơn giản là quản lý đống.

Mọi ý kiến?

+6

Nó chỉ có thể không mất một giờ nếu bạn không làm bất cứ điều gì trong destructor. Phải có cái gì đó đang chặn nó. Bạn đã thử lược tả nó chưa? – Naveen

Trả lời

1

Nếu 15 GB bộ nhớ đang được phân bổ cho một số lượng nhỏ các lớp học hợp lý, bạn có thể ghi đè lên toán tử xóa cho các lớp đó. Chỉ cần chuyển cuộc gọi đến xóa tiêu chuẩn, nhưng thiết lập cờ toàn cầu, nếu được đặt, sẽ thực hiện cuộc gọi để xóa no-op. Hoặc, nếu logic của chương trình của bạn là như vậy mà các đối tượng này không bị xóa trong quá trình bình thường xây dựng cấu trúc dữ liệu của bạn, bạn chỉ đơn giản là có thể bỏ qua xóa trong tất cả các trường hợp cho các lớp này.

1

Như Naveen cho biết, điều này không thể là vấn đề giải quyết bộ nhớ. Tôi đã viết mô phỏng mạng thần kinh với các thuật toán tiến hóa, nơi phân bổ và giải phóng rất nhiều bộ nhớ trong các khối nhỏ và lớn và điều này không bao giờ là một vấn đề lớn.

4

Trong tiêu chuẩn C++ bạn chỉ có hủy bỏ(), nhưng điều đó có quá trình trở về thất bại cho hệ điều hành.

Trên nhiều nền tảng (Unix, MS Windows), bạn có thể sử dụng _exit() để thoát khỏi chương trình mà không cần chạy dọn dẹp và hủy.

+0

_exit() không nói gì về destructors vì nó là hàm POSIX (không nói gì về C++). Hiện tại nó không gọi bất kỳ destructors trên nền tảng tôi có, nhưng nó không được đảm bảo bằng tài liệu. –

+0

Đó là lý do tại sao tôi nói rằng điều này hoạt động trên các nền tảng cụ thể. Nhưng như được thảo luận tại http://stackoverflow.com/q/4769229/585729, đó là trường hợp trên bất kỳ nền tảng nào tồn tại. – JoergB

1

Nếu bạn có trình biên dịch C99, bạn có thể sử dụng chức năng _Exit để kết thúc ngay lập tức mà không bị hủy đối tượng toàn cục hoặc bất kỳ chức năng nào được đăng ký với atexit để được gọi; có hay không dữ liệu tệp đệm không được ghi đè bị xóa, các luồng mở được đóng lại, hoặc các tệp tạm thời được loại bỏ được xác định thực hiện (C99 §7.20.4.4).

Nếu bạn đang sử dụng Windows, bạn cũng có thể sử dụng ExitProcess để đạt được hiệu quả tương tự.

Nhưng, như những người khác đã nói, các trình phá hủy của bạn thực sự không mất một giờ để chạy trừ khi bạn đang thực hiện một số tiền hợp lý của I/O (ghi tệp nhật ký, v.v.). Tôi mạnh mẽ, khuyên bạn nên lập hồ sơ cho chương trình của bạn để xem thời gian được sử dụng.

1

Các chiến lược có thể tùy thuộc vào số lượng đối tượng được hiển thị trực tiếp trong main thông qua đó bạn truy cập 15GB dữ liệu và nếu chúng là cục bộ để phân bổ chính hoặc tĩnh.

Nếu tất cả truy cập vào các 15GB dữ liệu là thông qua đối tượng địa phương trong main, sau đó bạn có thể chỉ đơn giản là thay thế các return 0; vào cuối main với exit(0);.
exit sẽ chấm dứt ứng dụng của bạn và kích hoạt dọn dẹp các biến được phân bổ tĩnh, nhưng không phải biến địa phương.

Nếu dữ liệu được truy cập thông qua một số biến được phân bổ tĩnh, bạn có thể biến chúng thành con trỏ (hoặc tham chiếu) thành bộ nhớ được cấp phát động và cố ý làm rò rỉ.

2

C++ 0x std::quick_exit là những gì bạn đang tìm kiếm nếu trình biên dịch của bạn đã hỗ trợ nó (g ++ - 4.4.5 không).