【发布时间】:2018-12-10 14:06:05
【问题描述】:
我有很多非常相似的功能,比如
void someLargeFulction1(args)
{
IDENTICAL CODE
DIFFERENT CODE 1
IDENTICAL CODE
}
//---------------------------//
//---------------------------//
void someLargeFulctionN(args)
{
IDENTICAL CODE
DIFFERENT CODE N
IDENTICAL CODE
}
所有这些函数的不同之处仅在于DIFFERENT CODE N 部分(这是一系列浮点运算)。由于大部分someLargeFulctionN 代码是相同的,所以我不会避免代码复制,因为这会使代码维护变得非常复杂。减少代表是我的主要目标。不幸的是,由于严重的性能影响,我无法将 DIFFERENT CODE 组织为函数调用并将此函数作为 someLargeFulction 参数传递 - DIFFERENT CODE 的执行速度比典型的函数调用快得多,编译器调用内联的情况除外。我不想将someLargeFulctionN 组织为宏定义(但这是可能的解决方案)。
在 C++ 编程语言中,我有一个非常简单实用的解决方案——模板函数。我可以这样做:
template <int N>
void someLargeFulction(args)
{
IDENTICAL CODE
differentCode<N>();
IDENTICAL CODE
}
并为所有变体专门化 differentCode() 函数。对于所有经过测试的编译器(g++、MVSC),它都非常好用!编译器总是内联一个differentCode 调用,我有必要数量的someLargeFulction 变体。问题是现在我需要将此代码移植到С98。为了直接解决问题,我需要创建完整数量的someLargeFulction 副本,这是一个糟糕的决定。使用带有someLargeFulction 实现的宏定义可以接受,但不可取。您还看到了哪些其他选项?
【问题讨论】:
-
我认为您的示例并不能真正展示您列出的要点,但您所展示的一切都不能用函数指针来完成。
-
“使用c++模板不仅可以减少代码量”:注意这里的“代码量”是指“由程序员”而不是“编译器生成的代码量”。
-
这个问题真的没有意义。 “我的锤子可以利用套筒扳手的哪些功能?”
-
您是否尝试过使用函数指针的等效 C 代码?如果是这样,您会注意到在完全优化时实际上没有任何间接调用。
-
一个 C 宏就可以了。
标签: c++ performance templates refactoring c99