繁体   English   中英

如果将一个类的功能主义者分成c ++中的几个类,我会降低程序的效率吗?

[英]Will I reduce the efficiency of the program if separate the functionalists of one class into several classes in c++?

只是想知道将一个班级分成几个班级会降低一个项目的效率。 为了使我的问题清楚,我举出以下例子:

class OneClass
{
  public:
      Do_the_job()
      {
       Do_function1();
       Do_function2();
       Do_function3();
       }
      Do_function1();
      Do_function2();
      Do_function3();
      variables_related_to_function1;
      variables_related_to_function2;
      variables_related_to_function3;
}  

在此类中,功能可以分为三个子功能,它们属于同一类。 但是,出于易于维护的目的,我决定将每个子功能都设为一个类,并且通过将三个独立的类组合到一个类中来执行整个功能:

Class OneClass
{
public:
   Do_the_job()
   {
     class1.do_function1();
     class2.do_function2();
     class3.do_function3();
   }
   Class1 class1;
   Class2 class2;
   Class3 class3;
}   

我的问题是,新的实施会降低计划的效率。 谢谢。

可能不是,即使这样,您也不太可能注意到。

调用另一个对象的方法的最坏情况是通过指针调用虚拟方法,该方法需要使用vtable查找来查找要运行的代码,并且必须在运行时完成,因此不必进行内联。 但这甚至是非常快的,除非在非常特殊的情况下,否则您不会注意到它。

按值保存的对象上的普通成员函数与调用您自己的成员函数一样快。

除非您看到它们实际上是引起问题的原因,否则请不要担心。 除了有缺陷的算法(甚至在某些迭代器类上不必要地使用后缀增量)导致的潜在速度问题之外,您正在进行的哪种函数调用的影响都可以忽略不计。

建议您首先集中精力使逻辑设计正确,然后再考虑这些优化。 现代编译器和链接器将执行的各种优化非常令人印象深刻,在进行性能测量/分析之后,您应该只担心这些性能问题。

特别是,现代的链接器可以在适当的时候进行整个程序的优化 ,这实际上可以从另一个模块内联一个方法,即使该模块在另一个静态链接库中也是如此。 因此,如果您要移出的方法非常小,则可执行代码可能与原始代码基本相同。

答案是“可能不是”。 虽然我从未试图对此进行基准测试,但我确实知道大多数开发人员都在编写具有凝聚力的类,而不是特定数量的函数。 我倾向于在班上只允许10个左右的功能。 比这更复杂,我需要重新思考我的设计。

话虽如此,如果它更慢,差异可能是不可辨别的。 除非您要进行大量的对vtable调用而进行繁重的多态设计,否则您不会注意到任何区别。

即使您有多个类,一种方法的调用仍然需要与仅使用一个类相同的时间。 因此,我认为没有理由不应该拆分大型类并从更好的可读性和可维护性中受益。

真正重要的是,如果您开始使用虚拟方法,这需要在运行时查找方法的地址(如果编译器无法在编译时解析/内联它)。 在这种情况下,调用采用3的顺序而不是1个机器代码指令。

如果您正在使用动态调度和多重继承,则会产生大约4-5个机器代码指令的开销,而不是一个。

就是说,我应该提一下,除非您有一个类的数千个对象,否则您可能不会感觉到明显的不同。 但是,您可以再次开始虚拟化类以减少开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM