代码之家  ›  专栏  ›  技术社区  ›  Umair

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

  •  0
  • Umair  · 技术社区  · 6 年前

    现在我对内联函数的RAM和ROM用法感到困惑。

    任何人都可以将内联函数的内存使用与RAM和ROM使用结合起来,特别是在裸机代码的上下文中。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Clifford    6 年前

    你的链接器将能够生成一个包含ROM和RAM使用摘要的链接图-你可以使用内联和不使用内联来构建,并亲自查看结果。

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

    只有当编译器选择应用 inline 请求。例如,GCC不会在-O0(默认)优化级别上这样做,甚至在所有情况下也不会这样做,甚至可能是没有显式标记为内联的内联代码。

    编译器可能有强制内联的方法,但是 关键字不是它-例如在GCC中,您将使用 __attribute__((always_inline)) 函数属性。然而,对于现代优化编译器来说,在应该和不应该内联时对编译器进行二次猜测通常是一个坏主意。它通常会在不需要开发人员努力的情况下,在任何规模的代码基础上做出更好的整体决策。

        2
  •  -1
  •   0___________    6 年前

    如果从闪存运行代码,代码的长度不会影响RAM的使用。如果函数内联了不止一次,那么代码当然会更长(但不能用'inline'关键字保证)。

    “inline”关键字只是编译器的建议,如果要强制使用内联,则需要使用apripriate属性或pragma-for gcc __attribute__((always_inline))