Estoy creando un programa c que pretendo ejecutar en un procesador ARM en el marco de tiempo cercano. Quiero medir la cantidad de memoria que estoy usando con mis variables globales sin tener en cuenta el tamaño de la pila/pila. ¿Hay alguna manera de obtener gcc para volcar esto en tiempo de compilación o para recuperar esta información del binario compilado?¿Cómo mido el tamaño total de mis variables globales?
Respuesta
Una excelente manera de ver a dónde va su memoria es mirar el mapa del enlazador. Un mapa de enlace es un archivo generado por el vinculador y detalla todas las ubicaciones de memoria para el programa. Puede ver la asignación de memoria en un símbolo por símbolos para las variables globales, así como el código. He utilizado mapas de enlazado en el pasado para proyectos que tienen requisitos de memoria ajustados. Facilitan la identificación de áreas problemáticas como los búferes de memoria global que ocupan mucho espacio.
Añadir esta opción para la línea de comando gcc para generar el mapa enlazador:
-Wl, -Mapa = output.map
El conjunto de binutils de GNU contiene un programa llamado "tamaño", que es la forma más fácil de obtener los datos que necesita, o al menos una aproximación razonable. Para un programa típico (en este caso, no uno pequeño incrustado), el resultado sería algo así como:
text data bss dec hex filename
332268 2200 19376 353844 56634 test-directory/add
Las tres primeras columnas son tamaños de las secciones en el binario: "texto" es el código ejecutable, "datos" son constantes y demás, incluidos los que representan variables iniciales con inicializadores explícitos, y "bss" son los inicializadores de todo lo que se inicializa implícitamente estáticamente. En un programa embebido típico, esos inicializadores estáticos son casi exclusivamente para variables globales (y, para sus propósitos, es posible que desee incluir las otras variables estáticas en su medición, ya que tampoco están en la pila o en el montón).
Por lo tanto, creo que terminas con la suma de "datos" y "bss" siendo esencialmente lo que quieres. (Después de leer el artículo hlovdal vinculado a, estoy menos seguro de esto que yo, tal vez los comentaristas pueden agregar confirmación?)
(Después de eso, "dec" y "hex" son el tamaño total de todo en decimal y hexadecimal, y "nombre de archivo" es por supuesto obvio.)
- 1. En Code Igniter, ¿dónde debería declarar mis variables globales?
- 2. Variables globales y MPI
- 3. C++ de variables globales
- 4. ¿Debo usar variables globales?
- 5. Variables globales en R
- 6. C# - Winforms - Variables globales
- 7. objetivo-c - variables globales
- 8. variables globales en RequireJS
- 9. variables globales compartidas en C
- 10. Greasemonkey y variables globales
- 11. variables globales en C++
- 12. Variables globales con GO
- 13. Variables globales en hadoop
- 14. Imprimir todas las variables globales/variables locales?
- 15. Django, variables de plantilla globales
- 16. Variables globales en el motor Razor View
- 17. ¿Cómo obtener el tamaño de RAM total de un dispositivo?
- 18. Ruby on Rails - ¿Variables globales?
- 19. Coffeescript + Prueba unitaria: variables globales?
- 20. ¿Cómo llenar mis variables WTForm?
- 21. ¿Cómo variables globales inicializadas por el cargador de Elf
- 22. ¿Cómo puedo guardar variables globales en el desarrollo de iOS?
- 23. Inicializando variables globales en VBA
- 24. Cómo crear variables globales en Erlang
- 25. Cómo usar variables globales en ObjectDataSource.SelectMethod?
- 26. Symfony 2 + Twig variables globales
- 27. ¿Cómo persisto datos sin variables globales?
- 28. Variables globales en C# .net
- 29. ¿Cómo puedo listar variables globales en MATLAB?
- 30. Cómo determinar el tamaño total de la caché ASP.Net?