2010-08-31 23 views
7

Tôi đã chơi xung quanh bằng cách nhúng tài nguyên vào chương trình C++ của mình. Để làm được điều này, tôi hexdump các dữ liệu vào một mảng đơn giản, ví dụ:Giải phóng bộ nhớ tĩnh? không, điều đó không thể đúng

unsigned char image_png[] ={ 
    0x0a, 0x0b, 0x0c, 0x0d, ... 
}; 

Một số các nguồn lực không được sử dụng sau khi tải (tức là họ nhận được chuyển đổi sang cái gì khác và sau đó là dữ liệu ban đầu chỉ là số lượng lớn ... mặc dù một lượng nhỏ hàng loạt để dễ phân phối có thể đáng giá).

Tôi tò mò nếu có cách nhúng tài nguyên vào chương trình, để tôi không phải lo lắng về việc nhị phân có thể tìm thấy tất cả tài nguyên quan trọng nhất, nhưng sau đó giải phóng nó sau khi hoàn thành đang được sử dụng để dấu chân bộ nhớ thời gian chạy mất ít hit hơn.

Điều này có khả thi không? Nếu nó là có thể, nó là một điều ngu ngốc để cố gắng làm gì? Ví dụ, có lẽ os sẽ giữ toàn bộ hình ảnh chương trình trong bộ nhớ anyway (Tôi không chắc chắn chính xác cách thức hoạt động).

chỉnh sửa: Để trả lời các ý kiến, tôi đang làm việc trên Linux (Ubuntu 10.04), nhưng nếu có những giải pháp đa nền tảng Tôi rất thích nghe họ

+1

câu hỏi thú vị! – Milan

+0

Biết hệ điều hành nào bạn đang làm việc sẽ cho phép các câu trả lời tốt hơn. – Novelocrat

+3

Thông thường, O/S không giữ tất cả các tệp thực thi trong bộ nhớ vật lý. Khi bạn cố truy cập một phần chương trình của mình lần đầu tiên, lỗi trang được kích hoạt và phần đó được tải từ đĩa cứng. Nếu bạn không sử dụng nó trong một thời gian, nó sẽ bị xóa khỏi bộ nhớ vật lý. Cố gắng truy cập lại nó sẽ dẫn đến lỗi trang khác (chỉnh sửa: lỗi trang không có gì phải lo lắng, nó giống như lỗi bộ nhớ cache) – Tomaka17

Trả lời

4

Như Tomaka17 nói, bạn không thực sự phải lo lắng về nó - nếu bạn không bao giờ chạm vào tài nguyên đó, nó sẽ không bao giờ bị lỗi, và nó sẽ không tiêu thụ bộ nhớ vật lý. Khi bạn tải một DLL/như vậy/bất cứ điều gì, nó thực sự chỉ bản đồ các tập tin vào bộ nhớ; cố gắng truy cập tệp đó là kết quả thực sự đọc tệp, từng mảnh một.

+0

vì vậy tôi chắc chắn sẽ sử dụng tài nguyên * một lần *, ở đầu chương trình. tức là tải tệp png, chuyển tệp đó thành bitmap gốc để hiển thị trên GUI. Sau đó, png là không cần thiết nữa. – cheshirekow

+0

Điều này không hoàn toàn đúng - bởi vì trong mọi khả năng dữ liệu sẽ nằm trên cùng một trang bộ nhớ như một số mục khác mà bạn * đang sử dụng. –

+0

@Billy Đã cấp, nhưng hình ảnh khá lớn và các trang chỉ có 4k. Nó tốt hơn nhiều so với chế độ xem ngây thơ của toàn bộ DLL được tải nguyên văn –

0

Một cách tôi đã nhìn thấy được sử dụng trong một số các ứng dụng được ghép nối dữ liệu vào cuối của tệp thực thi, sau đó thêm kích thước của dữ liệu.

Sau đó, bạn có thể mở tệp thi hành, chuyển đến cuối luồng và đọc kích thước của dữ liệu, sau đó quay lại kích thước đó và đọc tài nguyên.

Lưu ý rằng tài nguyên sẽ chính xác như bạn đặt chúng, vì vậy tổ chức có thể gặp rủi ro.

Tôi cũng không thể biết đây có phải là phương pháp hay nhất hay không nhưng có vẻ như nó hoạt động.

+0

Đó là một giải pháp thông minh. Tôi có thể tar các tài nguyên với nhau và sau đó sử dụng một thư viện tar để tìm tất cả các tập tin bên trong kho lưu trữ. Nếu tôi hiểu chính xác quy trình sẽ như sau: $ SIZE = stat -s% o "executable"; cat resources.tar >> thực thi; printf "% 20i" $ SIZE >> thực thi; – cheshirekow

+0

Chỉ cần chuẩn bị sẵn sàng cho mọi antivirus dưới ánh mặt trời để bắt đầu phàn nàn khi tổng kiểm tra không khớp. ;) –

+0

Điểm tốt. Một lưu ý phụ, một chương trình lớn tiêu tốn một lượng lớn tài nguyên hệ thống, làm chậm (và đoán lần thứ hai) mọi thứ bạn làm, và ngăn chặn hoạt động bình thường của một hệ thống ... nghe như một loại vi-rút đối với tôi. Phần mềm chống virus yêu thích của tôi: rdiff-backup. – cheshirekow

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