我有一个类成员函数,这是我的应用程序中的关键路径。我的应用程序必须尽可能快地交付预期的(阅读:而不是希望的)整体性能。

该函数相当复杂,但是几乎相同的部分重复了几次。就像是:

if (condition)
{
    //... some code
}
if (another condition}
{
    //... nearly identical code which may change condition
}
if (condition)
{
    //... some code (same as above)
}

// and so on

为了使代码更易于阅读,理解和维护,我喜欢将其分解并改用函数调用。喜欢:
if (condition)
{
    some_function(some_param);
}
if (another condition}
{
    some_function(some_other_param);
}
if (condition)
{
    some_function(some_param);
}

我负担不起任何开销调用函数,因此我想确保some_function始终是内联的。

我搜寻了SO,读了几篇讨论类似问题但并不完全相同的文章。这些帖子表明唯一的方法是macro

我讨厌使用macros,但另一方面,我也讨厌当前函数的复杂性。就像在两种邪恶之间进行选择。

是这样吗?宏是实现此目标的唯一方法吗?

更新资料

我收到了很多很好的反馈(谢谢)。

几乎所有答案都表明我将不必担心/担心强制将函数调用内联,因为无论如何编译器都会为我做得最好。

所以我决定去做一个测试。我重写了代码,以便每当代码片段可以重用并最终以更具可读性(和可维护性)的版本使用函数调用。

然后,我通过100次测试运行对新代码和旧代码进行了测试,并将性能计算为平均值。平均而言,新版本的性能比旧代码低约1%(0.8.8%)。因此,性能受到了影响。另一方面,性能下降没有我预期的那么高。

我的结论是,我更喜欢新代码,因为它更容易理解。这也意味着更易于维护,调试和移交给其他人。然后,我必须通过增加一些其他代码块来查找性能损失。

哦,最后一件事-接受哪个答案?我真的不知道所有答案都是有用的输入。但是实际上只有两个答案可以解决原始问题。对我来说,它们看起来同样不错,所以我将首先发布它。

最佳答案

好吧,宏将是获取内联代码的唯一保证方法。

您也可以使用inline关键字声明C++函数。这在范围界定方面有一些含义,但是对于大多数编译器而言,这也暗示了编译器应尝试生成与调用方内联的函数代码。

编译器是否会这样做是一个单独的问题。它可能也可能不需要启用某些编译优化选项。

您应该尝试编译inline函数,然后检查结果代码以查看编译器是否为您内联了函数调用。

关于c++ - 宏是强制内联的唯一方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35230077/

10-14 07:13