2010-08-31 10 views
7

Ben C++ programımı içine kaynakları gömme ile uğraşıyorum. Bunu yapmak için ben bu kaynakların bazıları başka bir şey dönüştürülür ve daha sonra orijinal veri sadece toplu olduğu yani (yüklendikten sonra kullanılmaz yaniStatik hafıza boşaltılıyor mu? hayır, bu doğru olamaz

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

, basit bir diziye veri HexDump ... dağıtım kolaylığı için küçük bir yığın olsa da buna değer olabilir).

Kaynağın programa gömülmesinin bir yolu var mı diye merak ediyorum, bu yüzden en önemli kaynakları bulmak için ikili hakkında endişelenmenize gerek yok, ancak sonra bittikten sonra serbest bırakın Çalışma zamanı bellek ayak izinin bir vuruştan daha az alması için kullanılır.

Bu mümkün mü? Mümkünse, yapmaya çalışmak aptalca bir şey mi? Mesela, belki de os tüm program görüntüsünü yine de bellekte tutacaktır (tam olarak bunun nasıl çalıştığından emin değilim).

düzenleme: çapraz platform çözümleri varsa yorumlarınızı yanıtlamak için, Linux (Ubuntu 10,04) üzerinde çalışıyorum ama onlara birkaç kullanılıyor görüldü ettik

+1

ilginç bir soru! – Milan

+0

Üzerinde hangi işletim sistemini kullandığınızı bilmek daha iyi yanıtlara olanak tanır. – Novelocrat

+3

Genellikle O/S, tüm yürütülebilir dosyaları fiziksel bellekte tutmaz. Programınızın bir bölümüne ilk kez erişmeye çalıştığınızda, bir sayfa hatası tetiklenir ve bu parça sabit sürücüden yüklenir. Bir süre kullanmazsanız, fiziksel bellekten kaldırılır. Tekrar erişmeye çalışmak, başka bir sayfa hatasıyla sonuçlanacaktır (düzenleme: bir sayfa hatası endişelenecek bir şey değildir, bir önbellek öznesi gibi) – Tomaka17

cevap

4

Tomaka17'nin dediği gibi, bunun için endişelenmenize gerek yok - eğer o kaynağa asla dokunmazsanız, asla arızalı olmaz ve fiziksel bellek tüketmez. Bir DLL/so/her ne yüklediğinizde, gerçekten sadece haritalar dosyaları belleğe; Bu dosyaya erişmeye çalışmak, aslında dosyayı okumanın sonucudur, parça parça.

+0

bu yüzden programın başında * bir kez * kaynağını kesinlikle kullanacağım. Örneğin, bir png dosyası yükleyin, GUI'de görüntülemek için yerel bir bitmap'e dönüştürün. Bundan sonra png artık gerekli değildir. – cheshirekow

+0

Bu kesinlikle doğru değildir - çünkü verilerin, * kullandığınız * diğer öğelerle aynı bellek sayfasında olması muhtemeldir. –

+0

@Billy Verildi, ancak görüntüler oldukça büyük ve sayfalar sadece 4k. Yüklenmekte olan tüm DLL dosyasının naif görünümünden çok daha iyi. –

0

Tek yön duymak isteriz uygulamalar yürütülebilir dosyanın sonunda verileri birleştiriyor, ardından verilerin boyutunu kendileri ekliyor.

Daha sonra yürütülebilir dosyayı fopen edebilir, akışın sonuna gidebilir ve verilerin boyutunu okuyabilir, daha sonra bu boyuta geri dönüp kaynakları okuyabilirsiniz.

Kaynakların tam olarak koyduğunuz gibi olacağını unutmayın, bu nedenle kuruluş risk altında olabilir.

Bunun en iyi uygulama olup olmadığını anlayamıyorum, ama işe yarıyor gibi görünüyor.

+0

Bu akıllı bir çözümdür. Kaynakları bir araya toplayıp arşivdeki tüm dosyaları bulmak için bir kat kitaplığı kullanabilirim. Doğru bir şekilde anlarsam süreç şu şekilde olacaktır: $ SIZE = stat -s% o "çalıştırılabilir"; cat resources.tar >> çalıştırılabilir; printf "% 20i" $ SIZE >> çalıştırılabilir; – cheshirekow

+0

Sadece, checksum'lar eşleşmediğinde şikayet etmeye başlamak için güneş altında her antivirüs için hazırlanın. ;) –

+0

İyi nokta. Bir yan notta, çok büyük bir sistem kaynağı tüketen büyük bir program, yaptığınız her şeyi yavaşlatır (ve ikinci tahmin eder) ve sistemik bir şekilde normal çalışmayı engeller ... bana virüs gibi gelir. En sevdiğim anti-virüs yazılımı: rdiff-backup. – cheshirekow

İlgili konular