类方法VS类静态函数VS简单函数 - 性能方面?

时间:2012-12-14 06:41:49

标签: c++ c macos class clang

好的,这就是我想要的:

  • 我写了几个非常苛刻的功能(主要是在位图上运行等),这些功能必须尽可能快
  • 现在,我们还要提到这些功能也可以按类型分组,甚至可以按照它们运行的​​变量类型进行分组。
  • 除了算法的实现之外,我还应该做些什么 - 从技术的角度来看 - 以免加快速度。

现在,我正在考虑以下情况

  • 将它们创建为简单函数,并将必要参数作为参数传递
  • 创建一个类(用于“分组”/组织目的)并将它们声明为静态
  • 按类型创建类,例如创建一个用于处理位图的类,为每个位图创建该类的新实例(例如Bitmap* myBitmap = newBitmap(1010);,并使用其内部方法对其进行操作(例如myBitmap->getFirstBitSet()

现在,哪种方法最快?直接简单函数和类封装static函数之间是否真的有区别?还有什么其他可能更好的方案,我没有提到过?


旁注:我正在使用clang++编译器,适用于Mac OS X 10.6.8。 (如果这有任何区别)

2 个答案:

答案 0 :(得分:19)

在CPU级别,只有one kind of function,它非常重新组合C类。你可以自己制作,但是......

事实证明,C ++正在高效构建,将大多数函数直接映射到调用指令:

  • 命名空间级别函数就像常规C函数
  • 静态方法就像命名空间级别函数(从调用的角度来看)
  • 非静态方法与静态方法非常相似,只是在其他参数(一个指针)之上传递隐式this参数

所有这3个人都有完全相同的表现。

另一方面,virtual方法有轻微的开销。有一个关于性能的C ++技术报告,估计与非虚拟方法相比,函数的开销在10%到15%之间(来自内存)。意味着对于内部有肉的任何功能(即,做实际工作),开销本身就接近于在噪音中迷失。除非virtual调用可以在编译时推断,否则实际成本来自内联的抑制。

答案 1 :(得分:4)

经典的旧C函数和类的静态方法之间绝对没有区别。区别仅在于美学。如果您有多个C函数,它们之间有某种关系,您可以:

  • 将他们分组成一个班级;
  • 将它们放入命名空间;

差异将再次审美。这很可能会提高可读性。

如果这些C函数共享一些静态数据,那么将该数据定义为类的私有静态数据成员是有意义的(如果可能)。在这种情况下,具有类的变体优于具有命名空间的变体。

我不鼓励你创建一个虚拟实例。这会误导源代码的读者。

为每个位图创建一个实例是可能的,甚至可能是有利的。特别是如果在典型场景中多次调用此实例上的方法。