3

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

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

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

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

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

以这种方式很难在地点 1 和地点 2 之间进行同步。

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

__attribute__ ((always_inline))我们的系统不支持。

4

3 回答 3

2

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

假设a()是您想要内联或非内联形式的一段代码,并且是应该嵌入b()内联版本的函数。a()利用 C++ 模板并使用名为 egb()boolean 参数进行参数化JUST_A。现在,您的函数b()可能如下所示:

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

由于模板机制分别为每个参数化生成代码,因此布尔参数将得到优化,您最终将得到一个变体 (for JUST_A==false),它可以:

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

另一个只做

b()

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

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

于 2012-11-08T21:52:00.170 回答
0

提供两次功能。第一个函数在头文件中内联实现,第二个函数在调用内联函数的 cpp 文件中实现。

// function_inline.h
inline void function_inline()
{
   // implementation
}

// function.h
void function();

// function.cpp
#include "function.hpp"
#include "function_inline.hpp"
void function() { function_inline(); }

常规代码会调用function(),但可以在您希望内联函数的地方function_inline()使用。

于 2012-11-09T21:11:04.557 回答
0

使用宏。当你想调试时,将宏的主体复制到代码中,调试它,然后在完成后切换回宏。除非情况有点不寻常,否则您不需要多次单步执行该代码以使其正确。

或者,您可以使用Cog之类的预处理器替代方案或自定义脚本来验证代码是否保持不变。基本上,在两个文件中的相关块周围放置一个标记,然后提取和比较一些东西。如果它们不同步,请中断构建。

于 2012-11-09T21:21:52.030 回答