Ich frage das aus Neugierde und nicht aus echtem Bedarf, aber kann der Speicherverbrauch dieses winzigen MSVC++-Programms weiter reduziert werden? Quellcodedatei auf BitBucket.
Das Programm wurde mit "Optimierung für Dateigröße" kompiliert. Es erstellt ein nachrichtenloses Fenster und setzt einen Tastatur-Hook, um ein Symbol im Infobereich in Reaktion auf die Betätigung der Feststelltaste/Num Lock/Rollen-Taste anzuzeigen.
Laut VMMap werden die privaten Bytes wie folgt zugeordnet:
260 KB: Image
252 KB: Heap
240 KB: Seitentabelle
24 KB: Stapel
24 KB: Private Daten
------
800 KB GESAMT
Bild
Die Anwendung selbst verwendet nur 20 KB davon; der Rest wird von einem Dutzend DLLs verbraucht. Es scheint, als ob das so klein wie möglich ist.
Heap
Das Programm reserviert nur etwa 3 KB an Daten im Heap: genau drei Instanzen einer bestimmten Klasse. Der Rest muss aus der CRT und/oder dem Standard-OS-Code stammen.
Kann dies vielleicht reduziert werden? Dies scheint ein Hauptkandidat für Einsparungen zu sein.
Seitentabelle
Die gesamte virtuelle Größe dieses Programms beträgt 44 MB, was etwa 11k Seiten entspricht. Das sind im Durchschnitt 22 Bytes pro Seite (obwohl vermutlich eine Menge Einträge ungenutzt freigehalten werden). Also kann dies wahrscheinlich nicht weiter reduziert werden. Oder etwa doch?
Stapel und Private Daten
Nun, die sind bereits extrem klein... obwohl ich mich frage, warum sie nicht noch kleiner sind. Das Programm verfügt meiner Meinung nach nicht annähernd über so viele private Daten oder Stapel.
Können Sie Vorschläge machen, um eine dieser Abschnitte kleiner zu machen als sie bereits sind?
Weitere Erkenntnisse:
- Ein leeres Programm ohne CRT verwendet etwa 204 KB
- Der Aufruf von
CreateWindow
fügt 420 KB hinzu - Der Aufruf zur Setzung des Tastatur-Hooks fügt 156 KB hinzu
- Das Vermeiden der CRT-Nutzung spart 20 KB ein
- Die gesamte virtuelle Größe erhöht sich auf ähnliche Weise
- Die Nichtverwendung der CRT spart eine beträchtliche Menge an EXE-Größe ein: von 54 KB auf 18 KB, von denen 12 Ressourcen sind.
Es scheint also, als ob der Großteil dieses Speichers von der Windows API verbraucht wird, was bedeutet, dass keine signifikanten weiteren Reduzierungen möglich sind, es sei denn, man findet einen Weg, den Hook / Infobereichssymbole zum Funktionieren zu bringen, ohne ein Fenster zu erstellen (dieses Programm ignoriert sowieso alle Nachrichten).