如何在C&x2B中保持一致性+;如果函数仅在其中一个位置手动内联,则在两个位置调用该函数 我在工作中得到了一个Linux C++程序设计问题。p>

如何在C&x2B中保持一致性+;如果函数仅在其中一个位置手动内联,则在两个位置调用该函数 我在工作中得到了一个Linux C++程序设计问题。p>,c++,macros,inline,C++,Macros,Inline,函数f()在两个位置调用。它已声明为内联 在第一种情况下,f()被调用10000次,我们需要手动内联(将f()主体复制到调用方)以减少调用它的开销。结果证实了这些好处 在第二个位置,f()只被调用一次,目的与第一个位置不同 对于进一步的工作,我可能会在f()内部进行一些更改,如果我们手动内联,则需要在f()主体的第二个位置进行相同的更改,以便第1和第2个位置的f()始终完全相同 这样很难在位置1和位置2之间进行同步 我们不想使用宏,因为我们需要使用gdb进行调试 我们的系统不支持\uuuuuuu

函数f()在两个位置调用。它已声明为内联

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

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

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

这样很难在位置1和位置2之间进行同步

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


我们的系统不支持
\uuuuuuu属性((始终\u内联))

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

假设
a()
是您想要的内联或非内联形式的代码,而
b()
是应该嵌入
a()
内联版本的函数。利用C++模板,用<代码> BoOL EAN参数调用参数< <代码>(或)>代码>,称为“代码> JuSTIOA A/CODE >。现在,您的函数
b()
可以如下所示:

if (!JUST_A) {
    //do something
}
b()
if (!JUST_A) {
    //do something more
}
由于模板机制分别为每个参数化生成代码,布尔参数将得到优化,最终将得到一个变量(对于
JUST_A==false
),该变量可以:

//do something
b()
//do something more
还有一个只会

b()
(对于
仅为A==true
)。根据您是调用
a()
还是调用
a()
,您将运行一段代码还是另一段代码


你可以检查你的程序的反汇编,如果它真的工作,但它应该。尽管如此,我认为这不是一个好代码,如果可能的话,我更喜欢其他人建议的用于代码可读性的强制内联的一些变体。

提供该函数两次。第一个函数在头中内联实现,第二个函数在调用内联函数的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\u inline()

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


或者,您可以使用预处理器替代方案(如或自定义脚本)来验证代码是否保持不变。基本上,在两个文件中有问题的块周围放置一个标记,并进行提取和比较。如果它们不同步,请中断构建。

您的
内联
关键字是否有问题?
\uuuu属性(始终为内联)
怎么样?为什么您要手动内联它,而不是让编译器使用
内联关键字来内联它(或者,如果需要,类似于?将函数体编写为宏,并在需要的两个位置应用宏。如果调试代码,则可能没有启用任何优化,这可以解释为什么没有看到任何性能提高。正如其他人所说,使用
\uu属性(始终\u内联))
即使没有优化也能保证内联。你说
f()
是“声明内联的”。但更重要的是,它的主体在调用时是可见的吗?一个简单的程序示例演示手动内联的性能增益也会非常有帮助。