我正在使用 C++ 编写一些复杂的 FFT 算法,因此我需要实现四元数和 Hamilton-Eisenstein 码等代数结构。算法适用于该结构的二维数组。将它们实现为类的开销是多少?换句话说,我应该创建包含四元数类的 [M][N] 维度的数组,还是应该创建 [M][N][4] 数组并将 [4] 数组用作四元数?使用类更方便,但是创建 M*N 类并访问它们的方法而不是只使用数组 - 这不会有太多开销吗?我正在为大型图像处理编写算法,所以性能对我来说很重要。
问问题
310 次
2 回答
2
关于类的开销:除非您的类具有虚函数,否则使用类不会受到任何惩罚。
因此,例如,一个复变量数组可以写成:
std::complex<double> m[10][10];
但是,请注意 STL 集合类,因为它们倾向于使用动态分配并且有时会引入大量开销(即,我不会使用vector< vector<> >
.
您可能想研究使用诸如Eigen之类的库来实现快速、优化的矩阵/向量类。
于 2010-12-24T11:56:09.263 回答
2
恕我直言,通过将它们实现为类来为您提供更好的服务,因为这将使您更快地编写代码且错误更少。如果这对您很重要,您应该进行测量以查看最佳性能,但还要确保实际上是此代码是性能瓶颈。(强制性Donald Knuth 引用:“过早的优化是万恶之源”)。
我想说,大多数编译器都会很好地为您优化代码。很多时候,我发现除了这些低级的东西之外,还有其他东西会产生影响,比如添加早期测试或最小化数据集等等。
对于四元数,您仍然可以在内部使用数组来实现该类(如果实际上更快),这应该使差异变得不那么重要。
例如,确保您可以在多核机器上并行运行您的算法,或者使用 SSE 指令进行实际计算,您可能会得到更好的服务。
于 2010-12-24T10:28:38.823 回答