gpt4 book ai didi

c - 在封装的内联函数中返回

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:26 24 4
gpt4 key购买 nike

我正在清理用 C 编写的驱动程序 (Netgear A6210) 中的一些代码,我遇到了一个辅助函数 VIRTUAL_IF_DOWN(),它被强制内联(例如 __inline 而不是 inline) 并在末尾包含看似任意的 return 语句。

__inline void VIRTUAL_IF_DOWN(void *pAd)
{
/* Some code here */
return ;
}

但是,在将控制权交还给程序的其余部分之前,在其他两个函数的主体中调用了这个辅助函数,所以我的问题是,这个 return 语句是否与函数的其余部分内联,从而中断脱离更大的功能还是什么都不做?我对内联函数的一般经验法则是,我应该始终将它们视为单独的函数,而不是假设它们将按原样内联,无论如何,我已经举了一个封装函数作为示例:

static void rtusb_disconnect(struct usb_interface *intf)
{
/* Some code here and then an ugly looking preprocessor branch */
#ifdef IFUP_IN_PROBE
VIRTUAL_IF_DOWN(pAd); // Function is used here
#endif
/* Other code here */
}

对于凌乱的样板代码,我深表歉意,但即使 return 语句只是内联,它似乎也在混淆代码。隐藏可能影响内联函数后面的流程的语句似乎是一种不好的做法。什么是更好的解决方案?

我的问题的另一部分是,内联是在编译的预处理器阶段还是之后确定的,例如在汇编器或链接器阶段?

最佳答案

与宏预处理相比,内联不仅仅是复制粘贴代码。

当编译器遇到任何类型的内联指令时,它会评估内联函数返回或执行的操作。

您可以使用 godbolt.org 等网站查看为 C 代码生成的程序集。例如,以下函数计算出相同的汇编代码:

#include <stdio.h>

inline void test1(int number){
printf("%d", number);
return;
}

inline int test2(){
return 1+1;
}

void doSomething() {
test1(test2());
}

void doSomethingElse() {
printf("%d", 2);
}

和程序集:

.LC0:
.string "%d"
_Z11doSomethingv:
sub rsp, 8
mov esi, 2
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
add rsp, 8
ret
_Z15doSomethingElsev:
sub rsp, 8
mov esi, 2
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
add rsp, 8
ret

您可以在 https://godbolt.org/z/rBULdo 查看此示例

您还应该注意,内联是一种编译器优化。不同的编译标志可能导致内联的不同结果。

它还取决于编译时与运行时有多少信息可用。如果编译器在编译时知道更多信息,那么它可以比仅在运行时知道所有信息时更好地优化。

参见 link GCC 在遇到 inline 属性时的行为

关于c - 在封装的内联函数中返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52016381/

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