2) Kód knihoven by v paměti systému měl být jen jednou, společně pro všechny aplikace, takže to, že to jedna aplikace uvolní, asi nic nepřinese. Já bych se na to díval spíš tak, že jsem si tímhle zbytečně prodloužil exáč o nějakých 256 bajtů...
Pokud si dobře pamatuju, tak systém jednu knihovnu DLL může sdílet mezi více procesy, ale je to takové sdílení v uvozovkách, protože nezahrnuje propagaci změn. Funguje na bázi mechanismu
copy on write – knihovna je sdílena mezi procesy tak dlouho, dokud ji některý z nich nezmění (nepřipřadí do její proměnné atd.). Jakmile se tak stane, daný proces obdrží privátní kopii stránky, na které změnu provedl.
Tím nedochází k propagaci změn v jednom procesu do procesů jiných. Pro fungování mechanismu
copy on write je klíčový
WP bit procesorového registru CR0 (bit
Enable Write Protection). Pokud jej vypnete, což je z režimu jádra možné, a zapíšete do regionu paměti pod copy on write, začnou se dít zajímavé věci.
Copy on write má samozřejmě smysl hlavně v případě, že daná knihovna je namapována do všech procesů na stejnou virtuální adresu. Pokud tomu tak není, je nutné provést relokace, tudíž její obsah se liší a copy on write nelze příliš efektivně aplikovat.
1) Z principu by se mi víc líbilo, kdyby ty knihovny ani neimportoval, než aby je naimportoval, realokoval, a pak zahodil.
Také by se mi líbilo, kdyby byly importovány jen ty funkce, které jsou programem opravdu použity, ale Delphi má zřejmě příliš málo rozčleněné běhové knihovny, aby linker tuto optimalizaci mohl efektivně provést. Nebo taková optimalizace není dostatečně implementována, čemuž se mi nechce věřit.
Vzhledem k tomu, že většinu z těch DLL knihoven bude určitě používat nějaký jiný proces, tak si myslím, že tímhle uvolněním z adresového prostoru moc velké úspory nedosáhnete. Získáte více virtuálního adresového prostoru, což v některých případech může být u 32bitových aplikací výhodné, u 64bitových aplikací v tom nevidím žádný význam. Krom toho se může stát, že po úpravě programu začnete některou z těch knihoven nevědomky používat, což povede ke zlu.
A ten uvolňovací kód bude fungovat jen u 32bitových aplikací, protože Integer je 32bitový. Lepší by v tomto ohledu bylo užít NativeInt (NativeUInt) či Pointer.