c++ - 优化 c++ 矩阵/位图类

标签 c++ optimization templates matrix bitmap

我正在搜索一个 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/

相关文章:

c++ - 关于虚拟继承层次结构的问题

c++ - 死亡钻石和作用域解析运算符 (c++)

php - Zend AMF 优化;技巧和窍门?

javascript - JavaScript 中的函数调用有多昂贵?

c++ - 无法弄清楚为什么我的 if 语句不起作用 : ( if array[i] << average)

c++ - 指针如何传入函数参数?有示例程序吗?

php如何缓存函数输出直到脚本结束而不是define

c++ - 具有常量表达式 : error C2975 with VC++2008 的模板

php - 在 Mustache (php) 中使用点符号是不好的做法吗?

c++ - 在模板化容器成员上调用类函数