im *_*sed 5 c++ macros optimization inheritance templates
我想完成以下事项:
现在,我目前有一个使用宏的编译时解决方案,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)