在C ++中使用类代数结构矩阵的开销

时间:2010-12-24 10:03:44

标签: c++ class overhead quaternions algebraic-data-types

我使用C ++编写一些复杂的FFT算法,因此我需要实现四元数和Hamilton-Eisenstein代码等代数结构。算法适用于该结构的2D数组。将它们作为类实现的开销是多少?换句话说,我应该用[M] [N]维创建包含四元数类的数组,还是应该创建[M] [N] [4]数组并使用[4]数组作为四元数?使用类更方便,但是创建M * N类并访问它们的方法而不是仅使用数组 - 这不是太多的开销吗?我正在为大图像处理编码算法,所以性能对我来说很重要。

2 个答案:

答案 0 :(得分:2)

恕我直言,你可以更好地将它们作为类实现,因为这样可以让你更快地编写代码,减少错误。如果这对您来说很重要,您应该进行测量以查看最佳性能,同时确保实际上这个代码是性能瓶颈。 (强制Donald Knuth quote:“过早优化是万恶之源”。

我会说,大多数编译器都会为您优化代码做得很好。通常情况下,我发现除了这些低级别的东西之外,它还有其他的东西,例如添加早期测试或最小化数据集等等。

对于四元数,您仍然可以在内部使用数组实现该类(如果实际上更快),这应该会使差异变得更加重要。

例如,确保您可以在多核计算机上并行运行算法或使用SSE指令进行实际计算,可能会更好。

答案 1 :(得分:2)

关于类的开销:除非你的类具有虚函数,否则使用类不会受到惩罚。

因此,例如,复杂变量数组可以写为:

std::complex<double> m[10][10];

谨防STL集合类,因为它们倾向于使用动态分配,有时会引入大量开销(即,我不会使用vector< vector<> >生成数组。

您可能希望研究使用Eigen等库来快速优化矩阵/矢量类。