像这样的代码被认为是不好的做法吗?如果是这样,当func1
重复func2
的行为并且我需要同时存在两个函数时,我该怎么办(这不被认为是代码冗余吗(?!
UPD:对不起,我的插图不好,我会尝试更清楚地解释这个问题。我想问的是:我正在尝试设计一个优化类,该类大量调用func1
和func2
两个方法,func1
的实现使用func2
并且我希望这两个方法调用尽可能内联,因此最好像此代码一样从func1
调用func2
还是独立实现两者。
inline int func2(int x) {
return x * (x + 2);
}
inline int func1(int x) {
return x * (x + 1) * func2(x + 2);
}
如果避免多次编写相同的代码,则编写几个小函数是可以的。有些人可能会争辩说,太多的小函数使代码难以阅读,这是一个意见问题。
如果您担心性能,编译器将内联,如果它认为它会有所帮助,在证明存在问题之前,您不应该担心它。请参阅有关过早优化的问题。
一个函数调用另一个函数没有问题。如果你对它们进行采样,你会看到真正的程序比 2 次调用要深入得多。
至于内联,那也不是问题。优化编译器通常会内联func2
(假设其定义可见且启用了优化(。许多常见的编译器和优化器在内联方面都很聪明。他们通常知道何时内联,何时不内联 - 所有这些都不需要您的帮助。
编写小函数并不是一个坏做法。清晰度和意图通常比微优化更重要。在典型情况下,您的示例没有错。
如果它有助于代码的可读性,那么是的。您几乎应该始终以代码的可读性为目标。不要忘记正确命名您的函数,以便其他人可以轻松理解该函数在做什么。我说的其他人也是指几周或几个月后的你。 正如他们所说,你写代码一次,但读了很多次。
至于性能,现代编译器知道何时内联函数,您不必担心。在真正重要的情况下,您只需使用分析器找到主机点并最终更改它。但它发生的次数比你想象的要少得多。您几乎总能找到更好的方法来优化代码。
如果两者都在同一范围内实现,那么编译甚至可以在不inline
的情况下进行一些代数优化。前段时间,当看到编译器有时用目标函数的简单调用替换大型和复杂的结构(有点携带 d3d api 的参数(时,我感到非常惊讶。因此,如果您担心性能,而不是只是不要...至少你的应用程序基准测试真的很糟糕。
另一方面,这完全与关系有关:如果 func1 与 func2 在逻辑上没有真正的关系,那么只有代码\数学有点相同,而不是将 func2 复制到 func1 中更好。为什么?因为 func2 可能会被更改,但您忘记了 func1 并破坏了它,因为它们不是通过内部域逻辑相关联的。
一次又一次的更新
如果所有关于速度并且只有数学,那么在func1中编写完全优化的表达式而不依赖于编译器。但前提是你真的知道性能是第一位的。