我有一个删除器的函数指针,但大多数时候,不需要删除器,只有当我维护某物的内部拷贝时才需要。目前我使用 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
,并使用 if(deleter_ != 0) 检查
.Cleanup
函数(*deleter_)(object_)
现在在编码过程中,我突然想到“嗯,哪个版本会更快?”,所以这更多是个人兴趣而不是优化。对不起,如果这个问题听起来有点愚蠢,但它有点让我烦恼,我真的很想知道。感谢您提前回答!
最佳答案
函数调用必须设置堆栈帧。所有 if 语句所要做的就是执行一条机器指令。可能是两个,具体取决于机器的架构。
关于c++ - 什么更快 : noop function call or if statement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5386341/