2

只是想知道将一个类分成几个类是否会降低程序的效率。为了让我的问题更清楚,我举以下例子:

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;
}   

我的问题是新的实施会降低程序的效率。谢谢。

4

4 回答 4

4

可能不会,即使有,您也不太可能注意到。

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

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

不要担心这样的事情,除非你能看到它们实际上是造成问题的原因。除了由有缺陷的算法导致的潜在速度问题,甚至在某些迭代器类上不必要地使用后缀增量之外,您所做的函数调用类型的影响可以忽略不计。

于 2013-06-18T10:53:08.297 回答
2

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

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

于 2013-06-18T11:01:27.577 回答
1

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

话虽如此,如果速度较慢,则可能无法辨别差异。除非您通过多次调用来进行繁重的多态设计,否则您不vtable应该注意到差异。

于 2013-06-18T10:56:40.247 回答
0

即使您有多个类,调用一个方法所花费的时间仍然与只使用一个类相同。所以我认为没有理由不拆分大类并从更好的可读性和可维护性中受益。

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

如果您使用动态分派和多重继承,您将有大约 4-5 条机器代码指令而不是 1 条的开销。

也就是说,我应该提到,除非你有几千个类的对象,否则你可能不会感觉到明显的差异。但话又说回来,你可以开始去虚拟化你的类以减少开销。

于 2013-06-18T11:16:43.910 回答