派生类使用模板没有开销?

im *_*sed 5 c++ macros optimization inheritance templates

我想完成以下事项:

  1. 宾语.
  2. 调试对象版本,在函数中具有额外功能以进行跟踪.

现在,我目前有一个使用宏的编译时解决方案,do {} while(0)如果没有使用正确的标志编译库,则解析为a .

我想将此功能转移到在运行时启用.做这个的最好方式是什么?

我想做:Base * obj = (isGlobalDebugEnabled) ? new Debug(...) : new Base(...);输入东西.我是不是想要这样的东西?

注意,标准虚函数并不能真正解决问题,因为每个函数都必须在对象的派生(调试)版本中复制,从而破坏了目的.

此外,最低级别的功能是非常高的音量(配置文件时大于6000亿次调用)所以我想为"基类"编译一个编译的零开销解决方案.当然,Debug对象可能更慢.

这就是我想到模板的原因.注意:除了VS2010功能(基本lambda等)之外,我没有C++ 11/boost访问权限.我能做点什么吗

template <bool debug = false>
class Object {
    std::enable_if<debug> void printTrace(); // Add functions based on debug/not
};
void Object::doSomething(...){
    <only do this if debug without runtime check> addToTrace(...);
    doTheStuff();
}
Run Code Online (Sandbox Code Playgroud)

我看到这个链接指向我伪造的继承与模板方向,如果这有帮助.

谢谢您的帮助

AK

编辑:我刚刚意识到我可能会采用错误的方式 - 可能将Debug对象作为基类,并在Regular对象中使用no-ops覆盖功能.这似乎是一种更好的方式.但是,由于这些高性能要求,我仍然希望避免vtable跳转,所以我猜我的模板问题仍然存在?也许?

编辑2:正如KerrickSB所指出的,使用的一个例子可能更清楚:

主要代码:

void ComputeSomething() {
    Object * obj = (globalDebugFlag) ? new DebugObject(...) : new Object(...);
    obj->insertElement(elem); // Inserts in Object, Inserts and traces actions in DebugObject
    ...
}
Run Code Online (Sandbox Code Playgroud)

其中Object当前是一个单独的DLL,其中globalDebugFlag一个(建议的)全局变量由一个命令设置,该命令来自一个单独的端口,而不是导致调用ComputeSomething()的端口.

我计划使用全局跟踪变量,然后通过端口(通过处理此端口的全局对象)将跟踪推回,以便在前端工具上显示.

小智 3

根据定义,运行时决策意味着您在运行时(而不是编译时)以所有成本做出决策。你无法摆脱这一点。

但是,您可以将检查推入调用堆栈,直到它们满足您的需要的频率足够高,当然,然后更改调试标志的效果会稍微延迟(延迟多少取决于您省略的检查)。使用模板,您可以复制/专门化调试和非调试版本的代码,而无需复制源代码。

template <bool debug>
class Object {
  void something() {
    // branch on compile-time constant - can be optimized
    if (!debug) return;
    // ...
  }
}

template<bool debug>
useObject(Object<debug> o) {
    for(int i = 0; i < 10000; ++i) {
        // statically calls specialized implementation
        o.something();
    }
}

debugEnabled ? useObject(Object<true>()) : useObject(Object<false>());
Run Code Online (Sandbox Code Playgroud)

  • @bames53使用对象的代码还必须通过虚拟或类型擦除接口进行通信,或者还必须针对这两种情况进行复制。 (2认同)