C++ 静态内存使用的分层概述

C++ 静态内存使用的分层概述,c++,c,gcc,memory,embedded,C++,C,Gcc,Memory,Embedded,我正在为微控制器开发一些软件,我希望能够很容易地看到软件的哪些部分使用了多少内存。该软件不使用动态内存分配,我只对静态内存分配感兴趣(bss和数据部分) 所有这些静态内存实际上都是单个结构的一部分,其中包含(大部分)程序使用的内存。这是一个结构层次结构,对应于程序的组件。例如: 结构整体程序{ int x; 结构组件a; 结构组件b; }; 结构组件A{ int-y; 结构组件c; 结构组件d; }; ... 结构整体程序整体程序; 理想情况下,我希望看到用多级饼图表示的内存使用情况 我找不

我正在为微控制器开发一些软件,我希望能够很容易地看到软件的哪些部分使用了多少内存。该软件不使用动态内存分配,我只对静态内存分配感兴趣(bss和数据部分)

所有这些静态内存实际上都是单个结构的一部分,其中包含(大部分)程序使用的内存。这是一个结构层次结构,对应于程序的组件。例如:


结构整体程序{
int x;
结构组件a;
结构组件b;
};
结构组件A{
int-y;
结构组件c;
结构组件d;
};
...
结构整体程序整体程序;

理想情况下,我希望看到用多级饼图表示的内存使用情况

我找不到任何可以下降到这种结构的东西,只有打印全局变量大小(nm)的程序。这对我来说不是太有用,因为它只会告诉我整个程序的大小,而没有任何关于其部分的细节

请注意,解决方案不得采用解析代码的程序的形式。这将是不可接受的,因为我使用了大量的C++模板元编程,程序肯定不能处理。
如果没有这样的工具,我会对检索内存使用信息的方法感兴趣(从二进制文件或编译器中)。

而不是使用nm,通过让链接器直接输出映射文件,您可以获得相同的信息(可能更多)。但是,这可能无法解决您的问题-编译器可以解决结构的内部偏移,并丢弃符号,因此不需要在最终链接映射中可见-仅为链接目的保留外部引用

然而,实现目标所需的信息必须可供调试器使用(因为调试器能够扩展结构),因此某些工具可以解析编译器的特定调试信息——甚至可能是调试器本身——但这是一个长期目标,我想您必须自己编写这样一个工具


对的回答可能会有所帮助。

如果您在全局范围内而不是在整个程序的
结构内声明组件结构的实例,则映射文件应提供每个组件结构的大小。

将所有组件打包到一个结构中,自然只会在映射文件中列出整个程序。

示例结构不使用任何内存,除非显式实例化,然后这取决于您创建的实例数量。@Clifford我有一个根WholeProgram结构的实例。您只需检查/查看程序链接产生的.map文件,即可确定程序每个段的大小。@user3629249:在大多数链接器中,这只会告诉您
整个程序
——这不是我们要问的问题。