gpt4 book ai didi

c - 一次引用的静态函数的优化

转载 作者:行者123 更新时间:2023-12-03 16:51:24 27 4
gpt4 key购买 nike

我正在为 MSP430 编写嵌入式代码,使用最高优化级别的 IAR 编译器(速度或大小不会改变任何东西)。

我将一个函数定义为静态函数,然后在同一个文件中只引用它一次。由于该函数具有内部链接,并且仅使用一次,因此我希望优化器执行内联扩展。我看不出有什么理由不这样做。

函数很短,结果是16个字的机器码。它是从 ISR 调用的。添加 inline 关键字使函数内联,但优化器似乎需要提示。将它内联保存到堆栈中的两个 push/pop,一个 calla 和一个 reta

我期望执行内联扩展是否正确(即使没有 inline 关键字),还是我遗漏了什么?


编辑:更多的测试表明内联扩展依赖于函数的大小,并且阈值非常低。它似乎是大约 15 或 16 个字的机器代码。在此之上,如果没有给出关键字,优化器不会展开。

我仍然不明白为什么它不会(可读性不应该是优化器的关注点,不是吗?),但我知道 IAR 只能回答这个问题。

最佳答案

我使用的是几年前的 IAR ARM 编译器版本 (v5.2);我不知道其中有多少可能适用于 MSP430 编译器。

IAR ARM 编译器使用任何“高”优化设置为我内联未明确标记为 inline 的静态函数,-Oh(平衡),-Ohs(速度)或 -Ohz(大小)- 包括具有一定复杂度的静态函数(例如循环)。

当然,我想有一些静态函数没有内联,但快速检查表明 IAR 编译器通常正在执行此优化。

因此,我希望编译器内联您的静态函数 - 但如果您想依赖这些优化,我认为您需要检查输出(就像您所做的那样)。当然,哪些优化以及它们的应用方式完全取决于编译器,因此只有 IAR 才能真正回答优化是否“应该”发生的问题(或者为他们决定不应该发生的原因辩护)。如果您认为 IAR 没有适本地执行此优化,您可能想与 IAR 交谈。他们可能会为您提供一个指示,说明为什么在这种特殊情况下没有发生这种情况。

关于c - 一次引用的静态函数的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5038863/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com