C:堆栈或全局变量中的RAM优化?

时间:2016-12-02 09:27:51

标签: c memory stack global-variables

我正在用C编写的相当大的项目添加(还)另一个子模块,我希望在我的小处理器上运行。现在我想知道:我的新模块我很小,但它需要在每个周期堆积相当多的中间信息,以便计算它的东西。我创建了一个数据结构来保存所有这些中间数据,这就是我想知道的:

  • 我可以在我的模块源文件中创建这个数据结构的全局实例,在我的模块中的任何地方都可以随时使用。但这意味着RAM占用了这个中间数据的大小,即使其他模块正在运行。这就是我最初拥有的,而且无论如何都不是最优的。
  • 我可以在更新周期开始时创建此数据结构的本地实例,并始终将指针传递给每个函数。但从编码的角度来看它很糟糕(长函数原型),这意味着每次调用另一个函数时,我都必须在堆栈顶部添加该指针的另一个副本(对吗?)
  • 我还可以创建一个全局变量(作用于我的模块),它只是指向我的中间数据的指针。这意味着一个8位整数(即使所有模块都在运行),但不是更多。然后,可以从模块中的任何位置访问数据,而无需堆栈开销和长函数原型。

关于我的系统的一些信息:模块一个接一个地运行,仅重新进入以获得结果,但不执行进一步的计算。中间数据实际上只在每个模块的更新调用期间需要,并且这些数据总是以相同的顺序。

哪种解决方案最好?在哪个光?编译器在哪里发挥作用?我在这里不知道一般的记忆机制吗?

提前感谢您的澄清!

1 个答案:

答案 0 :(得分:2)

这很大程度上取决于您使用的系统类型,以及最重要的系统,执行速度或内存消耗。我会假设"小处理器"指微控制器。你没有提到重新入职,所以我认为这不是问题。

在这种情况下,如果您认为让文件范围结构浪费内存,那么您只是在欺骗自己。因为你总是必须设计最坏的情况,这里最糟糕的情况是调用需要使用结构的函数。那时,你的总体最坏情况内存消耗将涉及结构,无论结构是在文件范围还是在堆栈上分配,它总是相同的。

如果你没有足够的内存来处理最坏的情况,那么世界上没有任何分配方法可以拯救你。暂时保存一些内存并没有任何意义。"。在不运行最坏情况时节省一些内存是无关紧要的。对于最坏的情况,你仍然需要有足够的记忆力 - 要么你有这个,要么你没有。

因此,最好的选择是将结构保留在文件范围内,因为这不会影响内存消耗,但可以节省执行时间。

如果您的模块需要是线程安全的或允许多个实例,那么这完全是另一个故事。