当我在代码中编写内联函数(stm32的裸机代码)时,我知道每次调用此内联函数都会用其定义替换它,这样可以节省函数调用的开销,即保存堆栈。
现在,对于内联函数的RAM和ROM使用情况,我感到困惑。
任何人都可以将内联函数的内存使用与RAM和ROM使用结合起来,尤其是在裸机代码的情况下。
答案 0 :(得分:1)
您的链接器将能够生成带有ROM和RAM使用摘要的链接映射-您可以进行内联和不内联构建,并亲自查看结果。
内联会导致代码副本替换对单个代码副本的调用,因此根据定义,代码空间(在您的情况下为ROM)会增加。尽管由于不需要返回地址而将堆栈使用量减少了一点,但它对RAM的影响很小。这是运行时的减少,并且不会显示在链接映射中。
仅当编译器选择应用inline
请求时,它才会有所不同。例如,GCC不会在-O0(默认)优化级别上执行此操作,即使如此,也可能并非在所有情况下都这样做,甚至可能未明确标记为内联的内联代码。
您的编译器可能有强制内联的方法,但不是inline
关键字-例如,在GCC中,您将使用__attribute__((always_inline))
函数属性。但是,在使用现代优化编译器时,第二次猜测编译器涉及应该和不应该内联的内容通常是一个坏主意。通常,它将在任何规模的代码基础上做出更好,更全面的决策,而无需开发人员的努力。
答案 1 :(得分:-1)
如果从闪存中运行代码,则代码的长度不会影响RAM的使用。如果该函数内联多次,则代码将更长(但不能通过'inline'关键字保证)。
另一个问题是将SRAM存储器用于局部变量存储。通常,它会较低,因为内联允许进行更积极的优化(仅在启用优化后才能使用内联函数-否则将不会内联)。
'inline'关键字仅是对编译器的建议,如果要强制进行内联,则需要使用适当的属性或编译指示-对于gcc __attribute__((always_inline))