什么在FLASH中占用更多空间?静态变量或全局变量

Ber*_*ano 1 c stm32 ansi-c

正如标题所说,在FLASH中占用更多空间(例如在STM32μC中)?声明一个全局变量或在函数内声明一个静态变量?或者他们是否占用相同的空间?根据我的理解,这两个变量在整个程序运行时都可用.只是他们的范围不同.

hyd*_*yde 5

您可以使用0初始化的全局变量和静态变量.那些通常不占用闪存,因为它们被放置在内存位置,该位置在程序启动时被分配和归零,而不是来自闪存.

您也可以使用值初始化变量.在这种情况下,它们被放置在初始化的数据段中,因此根据数据类型的大小从闪存中占用空间.

函数内的静态变量也可以用代码初始化.初始化必须在运行时发生,但只能发生一次,所以它实际上生成了更多的代码,几乎在任何情况下都会占用比数据大小更多的空间(不一定,至少如果你用一个足够大的结构初始化一个足够大的结构)函数返回值).对于非const全局变量你也可以做几乎相同的事情,你只需要将它们初始化为orignally并将赋值(例如)放在开头main(),它需要与函数作用域静态变量初始化相同的空间代码带到别处.

结论,全局和函数范围的静态变量占用相同的空间量.


上面假设嵌入式上下文中的"全局变量",或者作为文件范围的静态变量.如果在动态可链接的可执行文件中导出全局符号,则该符号的重定位信息将占用可执行二进制文件中的一些空间.但是,我不认为给定的示例系统支持或使用可重定位的可执行文件.