用C(++)优化离开函数表

时间:2013-06-03 08:57:05

标签: c++ c optimization

为了使程序的一部分易于单元测试,我想让它采用一个函数表,它可以指向操作系统原语(即报告我们可以提供一组剪贴板目标的函数) )或测试版本。理想情况下,虽然我不想在实时版本中获得函数表的开销,但只是它为代码提供了额外的结构。所以我想通过某种方式告诉编译器函数表永远不会改变,以便它可以优化掉查找。像这样的东西(简单的实现插图):

#ifndef TEST
const
#endif
static struct {
    void (*reportTargets)(size_t targetc, const char **targetv);
    [...]
} interfaceToOutside
#ifndef TEST
= {
    reportTargetsLive,
    [...]
}
#endif
;

这有可能成功吗,如果没有关于如何实现这一目标的任何好建议(或者做得更好)?

2 个答案:

答案 0 :(得分:0)

  

所以我想告诉编译器函数表永远不会改变(...)

好吧,宣布所有const(顺便说一句,你应该在第conststatic之间插入第一个struct):

#ifndef TEST
# define CONST const
#else
# define CONST 
#endif

static CONST struct {
    void (*CONST reportTargets)(size_t targetc, const char **targetv);
    [...]
} interfaceToOutside
#ifndef TEST
= {
    reportTargetsLive,
    [...]
}
#endif
;

#undef CONST

(宏名称不好,我知道)。

现在,

  

这可能是诀窍(...)吗?

我是这么认为的,但您仍应检查生成的汇编程序代码-S / gcc的{​​{1}}选项。

答案 1 :(得分:0)

而不是函数指针,您可以使用静态内联函数创建2个结构。一个是测试,另一个是真实的。现在,根据您实例化模板的方式,您处于测试模式或实时模式。

struct Live
{
    static void Report(const std::string& report) { ReportLive(report); }
};

struct Test
{
    static void Report(const std::string& report) { ReportTest(report); }
};

template<typename T>
class Reporter
{
public:
    void doReport()
    {
        //some stuff todo
        T::Report(report);
        //other stuff todo
    }
};

这只是一个想法。在内联代码时,编译器将(完全)优化结构。此外,您可以通过实现不同的结构来选择不同的测试行为。