我使用C ++编写一些复杂的FFT算法,因此我需要实现四元数和Hamilton-Eisenstein代码等代数结构。算法适用于该结构的2D数组。将它们作为类实现的开销是多少?换句话说,我应该用[M] [N]维创建包含四元数类的数组,还是应该创建[M] [N] [4]数组并使用[4]数组作为四元数?使用类更方便,但是创建M * N类并访问它们的方法而不是仅使用数组 - 这不是太多的开销吗?我正在为大图像处理编码算法,所以性能对我来说很重要。
答案 0 :(得分:2)
恕我直言,你可以更好地将它们作为类实现,因为这样可以让你更快地编写代码,减少错误。如果这对您来说很重要,您应该进行测量以查看最佳性能,同时确保实际上这个代码是性能瓶颈。 (强制Donald Knuth quote:“过早优化是万恶之源”。
我会说,大多数编译器都会为您优化代码做得很好。通常情况下,我发现除了这些低级别的东西之外,它还有其他的东西,例如添加早期测试或最小化数据集等等。
对于四元数,您仍然可以在内部使用数组实现该类(如果实际上更快),这应该会使差异变得更加重要。
例如,确保您可以在多核计算机上并行运行算法或使用SSE指令进行实际计算,可能会更好。
答案 1 :(得分:2)
关于类的开销:除非你的类具有虚函数,否则使用类不会受到惩罚。
因此,例如,复杂变量数组可以写为:
std::complex<double> m[10][10];
谨防STL集合类,因为它们倾向于使用动态分配,有时会引入大量开销(即,我不会使用vector< vector<> >
生成数组。
您可能希望研究使用Eigen等库来快速优化矩阵/矢量类。