gpt4 book ai didi

c++ - 宏是强制内联的唯一方法吗

转载 作者:行者123 更新时间:2023-11-30 00:47:19 25 4
gpt4 key购买 nike

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

该函数相当复杂,但几乎相同的部分重复了几次。像这样的东西:

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

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

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

更新

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

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

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

然后我用 100 次测试运行测试了新代码和旧代码,并计算了平均性能。平均而言,新版本的性能比旧代码低 ~1%(略低于 .. 0.88%)。因此,性能受到了影响。另一方面 - 性能影响没有我预期的那么高。

我的结论是我更喜欢新代码,因为它更容易理解。这也意味着更容易维护、调试和移交给其他人。然后我将不得不通过在其他代码块中获得性能来找到损失的性能。

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

最佳答案

信不信由你,在某些情况下,函数调用最终会比内联代码更快

所以我建议以编译器可以在你的if语句中的调用点看到函数体的方式编写函数,可选择将函数标记为内联,然后让编译器确定内联调用是否更好。

然后您要做的是分析代码(或可能检查生成的程序集)并查看您的热点在哪里。如果它特别显示对您的函数的调用是热的,那么您必须求助于宏方法。请注意,如果您确实求助于宏,请确保您再次进行配置文件并且它确实有帮助。编译器非常擅长优化。

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

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