在C++中使用接口(抽象基类)时是否存在运行时性能损失?
据我所知,c/c ++中的switch语句有时会编译为跳转表.我的问题是,有没有拇指规则可以保证?
在我的情况下,我正在做这样的事情:
enum myenum{
MY_CASE0= 0,
MY_CASE0= 1,
.
.
.
};
switch(foo)
{
case MY_CASE0:
//do stuff
break;
case MY_CASE1:
//do stuff
break;
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
我按顺序覆盖从1到n的所有情况.可以安全地假设它会编译成跳转表吗?原始代码是一个冗长而混乱的if else陈述,所以至少我获得了一些可读性.
我处于这样一种情况,即我拥有具有虚函数Update()的游戏对象.有很多游戏对象(目前有7000多个),并且循环调用所有这些对象(以及其他内容)的更新.我的同事建议我们应该完全删除虚函数.可以想象,这将需要大量的重构.
我已经看到了这个答案,但就我而言,分析意味着我必须改变很多代码.所以在我开始考虑开始之前,我想我会在这里询问有关在这种情况下重构是否值得的意见.
请注意,我已经描述了循环的其他部分,并一直在尝试优化耗时最长的部分.我怀疑在这种情况下虚拟函数调用是我不应该担心的,但我不能确定,直到我配置文件,我不能分析,直到我更改代码(这是很多).另请注意,某些更新功能非常小,而其他更大功能则更复杂.
编辑:有很多答案可以提供很好的见解,所以任何在将来偶然发现这个问题的人都会看看所有答案,而不仅仅是所选答案.
没有RTTI和虚函数.
我遇到了两种不同的常见解决方案来提供对象的类型:
使用虚方法调用并在方法中保留id:
class Base {
public:
virtual ~Base();
virtual int getType() const =0;
};
class Derived : public Base {
public:
virtual int getType() const { return DerivedID; }
};
Run Code Online (Sandbox Code Playgroud)
使用内联方法调用并在基类中保留id:
class Base {
int id_;
public:
virtual ~Base();
inline int getType() const { return id_; }
};
class Derived : public Base {
public:
Derived() { id_=DerivedID;}
};
Run Code Online (Sandbox Code Playgroud)
一般来说什么是更好的选择,它们的利弊是什么?
我想知道我目前正在做的是C++的耻辱,或者它是否正常.
我致力于计算目的的代码.对于某些类,我使用具有虚拟/多态的正常继承方案.但我需要一些类来进行密集计算,并且避免由于虚拟性而产生的开销会很好.
基本上,我想使用没有指针或重定向的这个类:继承只是为了避免许多代码的复制/粘贴(基类的文件大小就像60Ko(这是很多代码)).所以没有虚函数,也没有虚拟析构函数.
我想知道从C++的角度来看它是否完全可以,或者它是否可以产生副作用(相关的类将在程序中使用很多).
非常感谢你.
可能重复:
虚函数和性能 - C++
我有一些课:
class I
{
public:
virtual void foo() = 0;
protected:
virtual ~I(){}
};
Run Code Online (Sandbox Code Playgroud)
此类不提供实例删除的接口,因此使析构函数保护是非常合理的解决方案.因此,不必将析构函数设为虚拟.但我有代码,它是虚拟的.
它看起来不是一个大错误,但它对于代码性能是否显着?当我们创建虚拟功能时,我们将另外一条记录添加到虚拟功能表中,当我们进行虚拟呼叫时,我们在此表中搜索.所以这意味着查找时间会增加.我对吗?
我最近不得不处理C++ 协方差返回类型,例如以下构造:
struct Base
{
virtual ~Base();
};
struct Derived : public Base {};
struct AbstractFactory
{
virtual Base *create() = 0;
virtual ~AbstractFactory();
};
struct ConcreteFactory : public AbstractFactory
{
virtual Derived *create()
{
return new Derived;
}
};
Run Code Online (Sandbox Code Playgroud)
它允许客户端代码在需要时将Derived对象视为Base类型或Derived类型,特别是不使用dynamic_cast或static_cast.
这种方法的缺点是什么?这是糟糕设计的标志吗?
谢谢.
c++ ×10
performance ×2
covariance ×1
crtp ×1
jump-table ×1
optimization ×1
polymorphism ×1
templates ×1
virtual ×1