gpt4 book ai didi

C编程。为什么函数指针会破坏优化

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:31 25 4
gpt4 key购买 nike

我对使用函数指针的 C 编程既爱又恨。我主要使用闪存空间有限的微 Controller ,所以显然我对使用优化非常感兴趣。一方面,函数指针让我的生活变得如此轻松,因为我可以编写一个硬件可移植软件模块,用户可以在其中提供函数回调来执行与硬件相关的事情(例如:用户回调以将字节写入串行端口)。这样,我可以编写 95% 独立于平台的代码,然后可以快速移植到新硬件。

另一方面,我注意到许多编译器在看到任何函数指针的使用时都会将优化抛到窗外。例如,我写了一个相当通用的函数,它接受一个枚举类型作为参数,然后有一个巨大的 switch/case 语句用于每个枚举类型选择来配置寄存器等,这取决于用户传递给函数的枚举类型。我'使用常量文字调用此函数一次,IE 应该永远不会改变的东西。构建的二进制文件似乎包括处理每个开关/案例选择的操作码,尽管除了一个案例选择之外的所有案例都应被视为“死代码”。我尝试了不同的优化设置,但为了获得最小的二进制文件,我必须完全注释掉除我需要的那个之外的每个“case” block ,这减少了大约 1k 字节的闪存利用率。如果我不使用函数指针,优化这段代码是没有问题的。

奇怪的是,我从来没有在我的代码中使用函数指针和函数的原型(prototype)。对于我使用的函数指针原型(prototype),指针在启动时建立一次指向静态函数,然后再也不会(另一个常量文字赋值)。我知道我可能可以在所有地方使用 #defines 来实现相同的设计目标,但令我恼火的是这些工具无法根据我的代码解释什么是可能的/不可能的。

我可以看到你有一个函数指针的情况,并且一些你无法预测的动态事物会执行该函数(即一个人在终端中输入并且你事先不知道参数是什么).

为什么编译器在使用函数指针时难以优化,即使是以可预测的方式进行优化,这有什么充分的理由吗?

最佳答案

没有看到您的代码,我无法得出任何明确的结论,但这是我从自己的经验中了解到的。

即使函数是静态的并且只调用一次,指针也会在运行时初始化。编译器无法优化地址直到运行时才知道的函数指针。

当函数存在于其他翻译单元时,它也无法优化掉函数指针;如果函数在翻译单元之外,它不知道函数在哪里,只知道它们已被声明;处理它是链接器的工作。我相信 LTO 在理论上应该是可行的来处理这个,但我不确定是否有任何实现这样做。

但是,如果某些编译器知道所有地址的位置,并且如果函数指针在编译时初始化,则可以优化函数指针(想到 MSVC)。

关于C编程。为什么函数指针会破坏优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38543512/

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