函数内联是否使用更多的RAM或ROM?对微控制器的RAM有什么影响?

时间:2019-03-16 12:41:32

标签: c embedded inline

当我在代码中编写内联函数(stm32的裸机代码)时,我知道每次调用此内联函数都会用其定义替换它,这样可以节省函数调用的开销,即保存堆栈。

现在,对于内联函数的RAM和ROM使用情况,我感到困惑。

任何人都可以将内联函数的内存使用与RAM和ROM使用结合起来,尤其是在裸机代码的情况下。

2 个答案:

答案 0 :(得分:1)

您的链接器将能够生成带有ROM和RAM使用摘要的链接映射-您可以进行内联和不内联构建,并亲自查看结果。

内联会导致代码副本替换对单个代码副本的调用,因此根据定义,代码空间(在您的情况下为ROM)会增加。尽管由于不需要返回地址而将堆栈使用量减少了一点,但它对RAM的影响很小。这是运行时的减少,并且不会显示在链接映射中。

仅当编译器选择应用inline请求时,它才会有所不同。例如,GCC不会在-O0(默认)优化级别上执行此操作,即使如此,也可能并非在所有情况下都这样做,甚至可能未明确标记为内联的内联代码。

您的编译器可能有强制内联的方法,但不是inline关键字-例如,在GCC中,您将使用__attribute__((always_inline))函数属性。但是,在使用现代优化编译器时,第二次猜测编译器涉及应该和不应该内联的内容通常是一个坏主意。通常,它将在任何规模的代码基础上做出更好,更全面的决策,而无需开发人员的努力。

答案 1 :(得分:-1)

如果从闪存中运行代码,则代码的长度不会影响RAM的使用。如果该函数内联多次,则代码将更长(但不能通过'inline'关键字保证)。

另一个问题是将SRAM存储器用于局部变量存储。通常,它会较低,因为内联允许进行更积极的优化(仅在启用优化后才能使用内联函数-否则将不会内联)。

'inline'关键字仅是对编译器的建议,如果要强制进行内联,则需要使用适当的属性或编译指示-对于gcc __attribute__((always_inline))