In realtà, se il codice non fa nulla, è anche giusto che il compilatore crea ancora un eseguibile? ;-)
Bene, su Windows qualsiasi eseguibile avrebbe comunque una dimensione, sebbene possa essere ragionevolmente piccola. Con il vecchio sistema MS-DOS, un'applicazione completa senza nulla sarebbe solo un paio di byte. (Penso che quattro byte utilizzino l'interruzione 21h per chiudere il programma.) Poi di nuovo, quelle applicazioni sono state caricate direttamente nella memoria. Quando il formato EXE divenne più popolare, le cose cambiarono un po '. Ora gli eseguibili avevano informazioni aggiuntive sul processo stesso, come il trasferimento del codice e dei segmenti di dati oltre ad alcuni checksum e informazioni sulla versione. L'introduzione di Windows ha aggiunto un'altra intestazione al formato, per indicare a MS-DOS che non è stato possibile eseguire l'eseguibile poiché era necessario eseguire Windows. E Windows lo riconoscerebbe senza problemi. Naturalmente, il formato eseguibile è stato esteso anche con informazioni sulle risorse, come bitmap, icone e moduli di dialogo e molto altro ancora.
Un eseguibile del nulla dovrebbe essere tra 4 e 8 kilobyte di dimensioni, a seconda del compilatore e di tutti i metodi utilizzati per ridurne le dimensioni. Sarebbe una dimensione in cui UPX risulterebbe in un eseguibile più grande! Potrebbero essere aggiunti ulteriori byte nel tuo eseguibile perché hai aggiunto alcune librerie al tuo codice. Specialmente le librerie con dati o risorse inizializzati aggiungono una quantità considerevole di byte. L'aggiunta di informazioni di debug aumenta anche la dimensione dell'eseguibile.
Ma anche se tutto questo è un buon esercizio per ridurre le dimensioni, ci si potrebbe chiedere se è pratico continuare a preoccuparsi di un eccesso di applicazioni. I dischi rigidi moderni divideranno i file in segmenti e per dischi molto grandi, la differenza sarebbe molto piccola. Tuttavia, la quantità di problemi che occorrerebbe per mantenere la dimensione più piccola possibile rallenterà la velocità di sviluppo, a meno che tu non sia uno sviluppatore esperto che è abituato a queste ottimizzazioni. Questi tipi di ottimizzazioni non tendono a migliorare le prestazioni e, considerando lo spazio medio su disco della maggior parte dei sistemi, non vedo perché sarebbe pratico. (Ancora, ottimizzo il mio codice in modo simile ma, di nuovo, sono esperto di queste ottimizzazioni.)
Interessato allo
EXE header? Inizia con le lettere MZ, per "Mark Zbikowski".La prima parte è l'intestazione MS-DOS vecchio stile per i file eseguibili e viene utilizzata come stub per MS-DOS che indica che il programma è
non un file eseguibile MS-DOS. (Nel file binario, è possibile trovare il testo "Questo programma non può essere eseguito in modalità DOS." Che è fondamentalmente tutto ciò che fa: visualizzare quel messaggio. Avanti è l'intestazione PE, che Windows riconoscerà e utilizzerà al posto di MS-DOS intestazione Inizia con le lettere
PE for Portable Executable. Dopo questa seconda intestazione ci sarà l'eseguibile stesso, diviso in diversi blocchi di codice e dati.L'intestazione contiene speciali tabelle di riallocazione che indicano al sistema operativo in cui caricare un blocco specifico. mantenere ad un limite, l'eseguibile finale può essere inferiore a 4 KB, ma il 90% sarebbe allora le informazioni di intestazione e alcuna funzionalità.
Un suggerimento: ottieni gli stessi risultati utilizzando la versione minGW di GCC? Non sono sicuro che quella dimensione sia insolita o no, perché non sono molto abituato al C++. – Macha
UPX? http://upx.sourceforge.net/ – bobince
Sì, conosco UPX, ma il problema qui è questo: il compilatore non dovrebbe generare ~ 23KB di junk per un programma vuoto. – George