Sto creando un programma c che intendo eseguire su un processore ARM nel prossimo lasso di tempo. Voglio misurare la quantità di memoria che sto usando con le mie variabili globali ignorando la dimensione dello stack/heap. C'è un modo per ottenere gcc per scaricarlo a tempo di compilazione o per recuperare queste informazioni dal binario compilato?Come si misura la dimensione totale delle variabili globali?
risposta
Un ottimo modo per vedere dove la memoria sta andando è quello di guardare la mappa linker. Una mappa del linker è un file generato dal linker e descrive in dettaglio tutte le posizioni di memoria per il programma. È possibile visualizzare l'allocazione della memoria su un simbolo in base al simbolo per le variabili globali e il codice. Ho usato le mappe di linker in passato per progetti che hanno requisiti di memoria stretti. Rendono facile identificare aree problematiche come i buffer di memoria globali che occupano molto spazio.
Aggiungi questa opzione alla riga di comando gcc per generare la mappa linker:
-Wl, -Map = output.map
GNU binutils Suite contiene un programma chiamato "dimensione", che è il modo più semplice per ottenere i dati necessari - o, almeno, una ragionevole approssimazione. Per un tipico programma (in questo caso, non è una piccola incorporato), l'uscita potrebbe essere simile:
text data bss dec hex filename
332268 2200 19376 353844 56634 test-directory/add
Le prime tre colonne sono dimensioni delle sezioni del binario: "testo" è il codice eseguibile, I "dati" sono costanti e così via - compresi quelli che rappresentano le variabili iniziali con inizializzatori espliciti - e "bss" è inizializzatori per tutto ciò che viene inizializzato implicitamente staticamente. In un tipico programma incorporato, quegli inizializzatori statici sono praticamente esclusivamente per variabili globali (e, per i tuoi scopi, potresti voler includere comunque le altre variabili statiche nella tua misura poiché non sono nemmeno nello stack o nell'heap).
Così, penso che si finisce con la somma dei "dati" e "BSS" essendo essenzialmente ciò che si desidera. (Dopo aver letto l'articolo hlovdal collegato a, sono meno sicuro di questo, forse i commentatori possono aggiungere conferma?)
(Dopo di che, "dec" e "hex" sono la dimensione totale di tutto in decimale ed esadecimale, e "nomefile" è naturalmente ovvio.)
- 1. misura dataGridView taglia a dimensione totale di righe e colonne
- 2. Come impedire la compilazione delle variabili globali "non utilizzate"?
- 3. Come trovare la dimensione delle allocazioni statiche da binario?
- 4. Frequenza delle variabili globali in python?
- 5. Ottieni la dimensione totale delle cartelle con find & du
- 6. TypeScript: Best practice delle variabili statiche globali
- 7. Come calcolare la dimensione totale dell'oggetto NSDictionary?
- 8. Variabili globali e MPI
- 9. Condivisione delle variabili tra i web worker? [variabili globali?]
- 10. PowerShell Variabili globali variabili locali
- 11. Variabili globali in Dart
- 12. Dimensione totale dell'oggetto NSMutableArray
- 13. ogg-c - variabili globali
- 14. Come determinare la dimensione totale della cache ASP.Net?
- 15. Come evitare l'uso di variabili globali quando si usa nftw
- 16. Variabili globali del polimero
- 17. Variabili globali in R
- 18. Variabili globali in hadoop
- 19. Jison variabili globali
- 20. Come si usano variabili globali o valori costanti in Ruby?
- 21. Variabili globali in Ember
- 22. variabili globali in Meteor
- 23. Chiarimento su cosa esattamente la dimensione dei caratteri CSS misura
- 24. Le variabili globali scherzano
- 25. Variabili globali dattiloscritto
- 26. Come si misura la dimensione di un TextBlock in WPF prima del rendering?
- 27. Accesso/intercettazione delle variabili oggetto globali di Nashorn
- 28. Come ottenere la dimensione totale della RAM di un dispositivo?
- 29. variabili globali condivise in C
- 30. JavaScript ed ES6, variabili "globali"