【发布时间】:2010-05-21 14:12:28
【问题描述】:
我正在搜索一个 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 尝试过,但没有成功。这种优化对于许多其他类似情况很有用。
【问题讨论】:
-
“这种优化对于许多其他类似情况很有用。”你是根据实际测试说的,还是只是你的信念?请记住,过早优化等等。
-
你分析过这段代码吗?对于任何未嵌入的东西,额外的乘法和加法甚至不太可能出现在 perf 中。在许多使用硬件矢量数学支持和/或批量复制值而不是一次复制一个值的平台上,这比试图摆脱两个标量操作更能赢得您的青睐。
标签: c++ optimization templates matrix bitmap