相关疑难解决方法(0)

在C++中使用接口的性能损失?

在C++中使用接口(抽象基类)时是否存在运行时性能损失?

c++ performance abstract-class virtual-functions

42
推荐指数
4
解决办法
1万
查看次数

"奇怪的重复模板模式"的实际应用

" 奇怪的重复模板模式 "有哪些实际用途?通常显示的" 计数类 "示例对我来说并不是一个令人信服的例子.

c++ templates design-patterns crtp f-bounded-polymorphism

42
推荐指数
2
解决办法
1万
查看次数

C++中是否存在多态性的替代方案?

关于动态多态性的问题中提出了CRTP.但是,据称这种模式仅对静态多态性有用.我所看到的设计似乎受到虚拟函数调用的快速阻碍,如此处暗示的那样. 加速甚至2.5倍将是太棒了.

有问题的类很简单,可以完全内联编码,但是直到运行时才会知道将使用哪些类.此外,它们可以以任何顺序链接,将性能损失归咎于伤害.

任何建议(包括如何在这种情况下使用CRTP)欢迎.

编辑:谷歌搜索提到功能模板.这看起来很有希望

c++ virtual-functions

8
推荐指数
2
解决办法
4462
查看次数

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陈述,所以至少我获得了一些可读性.

c++ switch-statement jump-table

8
推荐指数
2
解决办法
6366
查看次数

紧密循环中虚函数的成本

我处于这样一种情况,即我拥有具有虚函数Update()的游戏对象.有很多游戏对象(目前有7000多个),并且循环调用所有这些对象(以及其他内容)的更新.我的同事建议我们应该完全删除虚函数.可以想象,这将需要大量的重构.

我已经看到了这个答案,但就我而言,分析意味着我必须改变很多代码.所以在我开始考虑开始之前,我想我会在这里询问有关在这种情况下重构是否值得的意见.

请注意,我已经描述了循环的其他部分,并一直在尝试优化耗时最长的部分.我怀疑在这种情况下虚拟函数调用是我不应该担心的,但我不能确定,直到我配置文件,我不能分析,直到我更改代码(这是很多).另请注意,某些更新功能非常小,而其他更大功能则更复杂.

编辑:有很多答案可以提供很好的见解,所以任何在将来偶然发现这个问题的人都会看看所有答案,而不仅仅是所选答案.

c++ optimization virtual-functions

5
推荐指数
3
解决办法
2224
查看次数

c ++存储对象的类型,更好的选择是什么?

没有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++

5
推荐指数
1
解决办法
197
查看次数

将第一个虚拟函数添加到类中

在根据内存消耗,对象布局等向类添加第一个虚函数时会发生什么?虚函数比普通函数慢多少?

c++

5
推荐指数
1
解决办法
115
查看次数

C++:没有虚拟性的继承

我想知道我目前正在做的是C++的耻辱,或者它是否正常.

我致力于计算目的的代码.对于某些类,我使用具有虚拟/多态的正常继承方案.但我需要一些类来进行密集计算,并且避免由于虚拟性而产生的开销会很好.

基本上,我想使用没有指针或重定向的这个类:继承只是为了避免许多代码的复制/粘贴(基类的文件大小就像60Ko(这是很多代码)).所以没有虚函数,也没有虚拟析构函数.

我想知道从C++的角度来看它是否完全可以,或者它是否可以产生副作用(相关的类将在程序中使用很多).

非常感谢你.

c++ polymorphism virtual

2
推荐指数
2
解决办法
1677
查看次数

虚拟析构函数性能

可能重复:
虚函数和性能 - C++

我有一些课:

class I
{
public:
  virtual void foo() = 0;
protected:
  virtual ~I(){}
};
Run Code Online (Sandbox Code Playgroud)

此类不提供实例删除的接口,因此使析构函数保护是非常合理的解决方案.因此,不必将析构函数设为虚拟.但我有代码,它是虚拟的.

它看起来不是一个大错误,但它对于代码性能是否显着?当我们创建虚拟功能时,我们将另外一条记录添加到虚拟功能表中,当我们进行虚拟呼叫时,我们在此表中搜索.所以这意味着查找时间会增加.我对吗?

c++ performance

1
推荐指数
1
解决办法
290
查看次数

C++协方差返回类型有哪些缺点?

我最近不得不处理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_caststatic_cast.

这种方法的缺点是什么?这是糟糕设计的标志吗?

谢谢.

c++ covariance

0
推荐指数
1
解决办法
127
查看次数