笔者在群里看到有一个人问问题,说是要统计算法所占的内存数据。
开局先来张几张图吧,显示一下对话内容 看看大家的理解。
暂且命名问题是 小明提出,回答者有A、B、C
以上就是本篇文章的全部内容,让我们下次再讨论。
。。。。。。
-
小明说:想要计算 一段算法在所占用的内存
-
A(笔者):
- 建议看map文件,map文件可以看到data 段 的一些占用size,以armcc 为例,以.o为单位,统一一个.o文件中的data段的size。
- 所以我建议他放在一个文件,可以看到这个算法中.o文件的data段的大小,即就是全局变量以及静态变量所占用的size。
- 如果有malloc的话,会另算。
- 栈空间这块的,我没有考虑,栈是循环利用的,不是光算法占用,但是实际也应该考虑,如果栈消耗太大,则也会存在问题。
-
B:认为:
- 全局所需内存=全局变量(静态内存部分)+ 局部变量(动态栈内存部分)+malloc(动态堆内存部分),
- map只能统计静态部分,不能统计动态部分,因为map是编译静态产生的,
- 动态内存分为栈和堆,栈体现在动态变化的,
- 静态变量在栈里面看不到,
-
C:认为:
- 局部变量是静态内存,编译时确定,map里面局部变量的地址是相对于函数的偏移。
- 函数大小包括局部变量大小
- 动态内存只有堆,没有栈,如果局部变量很大,则会看到函数的体积变大
- 编译出可执行程序后,栈空间就不会增大了。
- 递归多次,只会增大函数的体积,不会栈超,栈超了,链接器会报错。
- map文件可以看出栈小,导致栈溢出的问题。
笔者来说说看法,经过试验得出的结果,