gpt4 book ai didi

c++ - 如果仅在其中一个地方手动内联,如何保持在 2 个地方调用的 C++ 函数的一致性

转载 作者:太空狗 更新时间:2023-10-29 21:47:25 26 4
gpt4 key购买 nike

我在工作中遇到了 Linux C++ 程序设计问题。

函数 f() 在两个地方被调用。它已被声明为内联。

在第一个地方,f() 被调用了 10000 次,我们需要手动内联(将 f() 主体复制到它的调用者)以减少调用它的开销。结果证实了这些好处。

在第二处,f() 只被调用一次,目的与第一处不同。

为了进一步的工作,我可能会在 f() 内部进行一些更改,如果我们手动进行内联,则需要在 f() 主体中对位置二进行相同的更改,以便 f() 在位置 1 和位置 2 始终完全一样。

这样很难让地方1和地方2同步。

我们不想使用宏,因为我们需要使用 gdb 进行调试。

我们的系统不支持

__attribute__ ((always_inline))

最佳答案

一种可能会生成有点不直观的代码,但允许同一段代码在内联和非内联版本中使用的可能性如下(如果恰好有一个地方需要内联函数,它就可以工作) .

假设 a()是您想要的内联或非内联形式的代码段,b()是内联版本 a() 的函数应该嵌入。使用 C++ 模板和参数化 b()bool ean 参数,称为例如JUST_A .现在,你的函数 b()可能看起来像这样:

if (!JUST_A) {
//do something
}
b()
if (!JUST_A) {
//do something more
}

由于模板机制分别为每个参数化生成代码, bool 参数将被优化掉,你最终会得到一个变体(对于 JUST_A==false ),它可以:

//do something
b()
//do something more

还有一个只做

b()

(对于 JUST_A==true )。取决于你是否调用a<true>()a<false>()您将运行一段代码或另一段代码。

如果这确实有效,您可以检查程序的反汇编,但它应该。不过,我认为这不是很好的代码,如果可能的话,我更喜欢其他人建议的强制内联的一些变体,以提高代码的可读性。

关于c++ - 如果仅在其中一个地方手动内联,如何保持在 2 个地方调用的 C++ 函数的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13297938/

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