c - C : stack or global variable? 中的 RAM 优化

标签 c memory stack global-variables

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

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

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

哪种解决方案最好?在哪个灯下?编译器在哪里发挥作用?这里有什么我不知道的一般内存机制吗?

预先感谢您的澄清!

最佳答案

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

在那种情况下,如果您认为具有文件作用域结构会浪费内存,那您只是在自欺欺人。因为您总是必须针对最坏的情况进行设计,而这里最坏的情况是调用需要使用该结构的函数时。届时,最坏情况下的总内存消耗将涉及该结构,并且无论该结构是在文件范围内还是在堆栈上分配,它总是相同的。

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

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

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

关于c - C : stack or global variable? 中的 RAM 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40928748/

相关文章:

objective-c - 使用 BLWebSocketsServer 写入 websocket

c - 使用线程计算文件中单词出现次数的程序中的段错误

c++ - 当我在同一内存中有两个指针时,为什么我必须调用 "delete"两次?

c - 为什么我在我的C程序中找不到无限循环来在链表中搜索?该程序有效

c++ - 如何在 C++ 中随机播放 std::stack?

c++ - cuda 内存分配 cudaMalloc

C 查找某个单词的所有实例

c++ - 如何使用游戏的基址指针在 C++ 中编辑值?

jQuery 存储 session 数据

javascript - 将代码重构为尾递归