Per il programma da http://bellard.org/mersenne.html GCC produce ~ 130 MB di eseguibile. Perché?GCC emette un eseguibile molto grande per il programma Mersenne
risposta
Provare a cambiare t[1<<25]={2}
a t[1<<25]
e la dimensione del * eseguibile ** scenderà a 7.3 K. (Inutile dire che non otterrete i risultati corretti)
Se fosse solo il t[1<<25]
, non avrebbe preso alcun spazio.
Il problema qui è che l'array viene inizializzato (primo elemento = 2, i successivi 2^25-1 elementi tutti 0) e l'array globale viene inserito nel segmento di dati solo perché è inizializzato.
Generare il gruppo per le 2 versioni ed esaminando la differenza rende ancora più chiaro:
[[email protected] ~]$ diff without_mem.s with_mem.s
15c15,21
< .comm t,134217728,32
---
> .globl t
> .align 32
> .type t, @object
> .size t, 134217728
> t: ***<- HERE!***
> .long 2
> .zero 134217724
Come possiamo notare, nella versione originale, l'assemblatore è diretta a generare 2^27 (134217728) byte nel segmento di dati. Quindi diventa parte del file oggetto stesso. (È possibile generare assembly compilando con lo switch -S
gcc -S -fverbose-asm t1.c
)
Ma perché 129 MB?
1<< n= 2^n (1 left shifted n times). => 1<<25=2^25. now 1 Integer= 4 bytes =2^2 bytes => 2^25 Integers=2^27 bytes=2^7 * 1 M bytes= 128 MBs
Per maggiori dettagli, si veda:
* Nota 1: E 'un object file in termini rigorosi.
Nota 2: Come indicato nei commenti, si può anche notare che la dimensione totale del processo (programma in esecuzione) sarà di 129 Mb anche se l'eseguibile è di 7.3K. (La memoria verrà assegnata una volta che il programma inizia l'esecuzione). È possibile visualizzare l'utilizzo della memoria del programma utilizzando il comando top
.
Nota 3: Vale la pena sottolineare che ciò vale solo perché t è globale. L'allocazione per i dati locali a una funzione avviene ancora in fase di runtime nello stack. Quindi se t
era locale, il file oggetto avrebbe preso solo 7.3K.
Nota 4: le variabili locali inizializzate static
, come le variabili globali inizializzate, vengono mantenute anche nel segmento data
. A static
globale è uguale a come globale eccetto che si limita l'ambito della variabile solo al file corrente.
Anche se la dimensione dell'eseguibile è 7,3 K, la dimensione del processo sarà ancora 130 MB. –
@brianbeuning È abbastanza ovvio, ma viene comunque aggiunto per completezza. – axiom
Questo è sorprendente, sono stato in grado di inizializzare array di notevoli dimensioni _molte volte con GCC e non ho mai visto nulla del genere. Nell'eseguibile vengono inseriti solo dati non uniformi, tutto il resto viene inizializzato con un ciclo simile a 'memset'. Forse sono usate alcune ottimizzazioni di ottimizzazione o flag di debug? – Damon
- 1. Scorrere un GtkDrawingArea molto grande
- 2. Echo un numero molto grande
- 3. Perché questo programma emette 64?
- 4. esegue un programma esterno (eseguibile) in python?
- 5. Come si misura un progetto piccolo, grande, molto grande?
- 6. build contesto per immagine docker molto grande
- 7. Come creare un programma eseguibile da AppleScript
- 8. Come posso creare un programma Java eseguibile?
- 9. Perché non ottengo output per un programma Hello World molto semplice?
- 10. perché il mio eseguibile in uscita C++ è così grande?
- 11. GCC: programma vuoto == 23202 byte?
- 12. Chiamare un programma eseguibile usando awk
- 13. File eseguibile generato tramite GCC in cygwin
- 14. Un programma C può modificare il suo file eseguibile?
- 15. Perché GCC emette "lea" invece di "sub" per la sottrazione?
- 16. Come può un programma cancellare il proprio eseguibile
- 17. GCC non emette un avviso quando si compila
- 18. pow o ** per un numero molto grande in Python
- 19. Mersenne Twister Riproducibilità tra i compilatori
- 20. Trie molto grande in Haskell
- 21. HTTP Download file molto grande
- 22. Perché questo programma C emette un numero negativo?
- 23. Valgrind segnala errori per un programma C molto semplice
- 24. Compilare un programma C++ con gcc
- 25. Discussione sicuro Mersenne Twister
- 26. Creazione di una mappa molto, molto grande in Java
- 27. Incorporamento di un eseguibile esterno all'interno di un programma C#
- 28. Impossibile trovare il file eseguibile nel percorso di ricerca configurato per il compilatore gnc gcc
- 29. dove/come Apples GCC memorizza DWARF all'interno di un eseguibile
- 30. Il flag di debug gcc -g influisce sull'esecuzione del programma?
Questo array t [1 << 25] occupa circa 129 MB di memoria, penso. – Mithrandir