我有一个删除器的函数指针,但大多数时候,只有当我维护某个东西的内部副本时才会需要删除器。目前我使用noop删除函数来做到这一点:
class MyClass{
public:
// bind object
template<class Type>
void Bind(Type* obj){
Cleanup();
object_ = obj;
}
// bind object with internal copy
template<class Type>
void Bind(Type obj){
Cleanup();
object_ = new Type(obj);
deleter = &Deleter<Type>;
}
private:
template<class Type>
static void Deleter(void* obj_ptr){
Type* obj = static_cast<Type*>(obj_ptr);
delete obj;
}
static void NoopDeleter(void* unused){
}
void Cleanup(){
(*deleter_)(object_);
object_ = 0;
deleter_ = &NoopDeleter;
}
typedef void (*DeleterFunc)(void*);
void* object_;
DeleterFunc deleter_;
};
现在显而易见的另一种选择是在不需要时将其设置为0
,并使用Cleanup
检查if(deleter_ != 0) (*deleter_)(object_)
功能。
现在在编码期间,它刚刚出现在我的脑海中“嗯,哪个版本会更快?”,所以它更多的是个人兴趣而不是优化。对不起,如果这个问题听起来有点愚蠢,但它有点让我烦恼,我真的很想知道。谢谢你提前给出任何答案!
答案 0 :(得分:3)
函数调用必须设置堆栈帧。所有if语句必须执行的是执行单个机器指令。也许两个,取决于机器的结构。
答案 1 :(得分:1)
与0的变量比较将比函数调用(通常是单个循环)更快,特别是考虑到必须将变量加载到寄存器中以进行函数调用。开销包括调整堆栈,按object_
和返回地址,调用函数....