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

问题描述 投票:1回答:2

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

现在我很困惑,在内联函数的RAM和ROM使用之间。

任何人都可以加入具有RAM和ROM使用的内联函数的内存使用,特别是在裸机代码的上下文中。

c embedded inline
2个回答
1
投票

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

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

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

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


-1
投票

如果从FLASH存储器运行代码,则代码长度不会影响RAM的使用。如果函数内联不止一次,代码将会更长(但'inline'关键字无法保证)。

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

'inline'关键字只是对编译器的建议,如果你想强制内联你需要使用apripriate属性或pragma - 对于gcc __attribute__((always_inline))

© www.soinside.com 2019 - 2024. All rights reserved.