在查看以下简单代码时,如果我知道我们没有从基指针中删除,那么引入虚拟析构函数是否有意义?出于性能原因,我们似乎应该尽量避免 vtable 查找。我了解过早优化等,但这只是一个一般问题。我想知道您对以下问题的看法:
- 如果我们不通过基指针删除项目,则使用受保护的析构函数
- 与引入单个虚拟方法相关的开销
此外,如果我的类只有析构函数作为虚拟方法,那么查找开销是否仅适用于析构函数方法,而其他方法不会产生惩罚,或者一旦引入 vptr,一切都会受到影响?我假设每个类内部都会有一个额外的 vptr,但它只需要在析构函数上执行 vptr 查找。
class CardPlayer
{
public:
typedef std::vector<CardPlayer> CollectionType;
explicit CardPlayer()=default;
explicit CardPlayer(const Card::CollectionType& cards);
explicit CardPlayer(Card::CollectionType&& cards);
void receiveCard(const Card& card);
bool discardCard(Card&& card);
void foldCards();
inline const Card::CollectionType& getCards() { return cards_; }
// virtual ~CardPlayer() = default; // should we introduce vtable if not really needed?
protected:
~CardPlayer()=default;
Card::CollectionType cards_;
};
--------------------------------------------------------------------
#include "CardPlayer.h"
#include <functional>
class BlackJackPlayer : public CardPlayer
{
public:
typedef std::vector<BlackJackPlayer> CollectionType;
typedef std::function<bool(const Card::CollectionType&)> hitFnType;
BlackJackPlayer(hitFnType fn) : hitFn_(fn) {}
bool wantHit()
{
return hitFn_(getCards());
}
hitFnType hitFn_;
};