13

好的,这就是我想要的:

  • 我已经编写了几个非常苛刻的功能(主要是在位图上操作等),它们必须尽可能快
  • 现在,我们还要提一下,这些函数也可以按类型分组,甚至可以按它们所操作的变量的类型分组。
  • 问题是,除了算法的实现之外,我应该做什么——从技术的角度来看——为了不影响速度。

现在,我正在考虑以下场景

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

现在,这些方法中哪一种是最快的?在性能方面,直接简单函数和类封装函数之间真的有什么区别static吗?任何其他更可取的情况,我没有提到?


旁注:我正在使用clang++Mac OS X 10.6.8 的编译器。(如果这有什么不同的话)

4

2 回答 2

23

在 CPU 层面,只有一种函数,它很像 C 的那种。你可以自己制作,但是...

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

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

所有这三个都具有完全相同的性能。

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

于 2012-12-14T07:36:28.107 回答
4

经典的旧 C 函数和类的静态方法之间绝对没有区别。区别只是审美。如果你有多个 C 函数,它们之间有一定的关系,你可以:

  • 将它们分组到一个类中;
  • 将它们放入命名空间;

差异将再次体现在美学上。这很可能会提高可读性。

如果这些 C 函数共享一些静态数据,则将这些数据定义为类的私有静态数据成员是有意义的(如果可能的话)。在这种情况下,带有类的变体比带有命名空间的变体更可取。

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

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

于 2012-12-14T07:24:28.330 回答