我正在搜索一个 2D 矩阵(或位图)类,它既灵活又能快速访问元素。内容一个灵活的类应该允许您在运行时选择维度,并且看起来像这样(简化):
class Matrix
{
public:
Matrix(int w, int h) :
data(new int[x*y]), width(w) {}
void SetElement(int x, int y, int val)
{
data[x+y*width] = val;
}
// ...
private: // symbols
int width;
int* data;
};
通常提出的使用模板的更快的解决方案是(简化):
template <int W, int H>
class TMatrix {
TMatrix() data(new int[W*H]) {}
void SetElement(int x, int y, int val)
{
data[x+y*W] = val;
}
private:
int* data;
};
这更快,因为宽度可以在代码中“内联”。第一个解决方案不这样做。但是,这不再很灵活,因为您不能再在运行时更改大小。
所以我的问题是: 是否有可能告诉编译器在代码大小固定时生成更快的代码(例如使用模板解决方案时)并在其运行时依赖时生成灵活的代码?
我试图通过在任何可能的地方写“const”来实现这一点。我用 gcc 和 VS2005 试过了,但没有成功。这种优化对于许多其他类似情况很有用。
最佳答案
我自己会选择第一个版本。
但是,如果您真的想要两全其美,您可以拥有一个 Matrix 类,它包含一个指向多态实现类型的指针。对于常见尺寸(比如最大 4x4),您可以指向模板实例化,对于更大的尺寸,您可以指向处理一般 MxN 情况的实现。
综上所述,我认为所有间接和虚拟调用都会抵消模板可能带来的任何性能改进。在这种情况下,我认为您不能既吃蛋糕又吃蛋糕。
如果你总是处理在编译时已知大小的数据(例如图形/几何 vector ),你最好使用模板版本(可能以静态大小(非堆分配)存储数据)数组)。如果您需要针对任意数据的通用功能,请改用动态版本。
关于c++ - 优化 c++ 矩阵/位图类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2878568/