我正在尋找一個二維矩陣(或位圖)類,它是靈活的,但也快速元素訪問。內容的靈活類應該允許你選擇在運行時的尺寸,而且會是這個樣子(簡化):C++矩陣/位圖類的優化
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試了一下,但沒有成功。這種優化對於許多其他類似的情況是有用的。
「這種優化方式對許多其他類似情況很有用。」你是基於實際測試還是僅僅基於你的信念來說這個?請記住,不成熟的優化和所有這一切。 – 2010-05-20 23:23:47
你是否分析了這段代碼?對於任何未嵌入的內容,額外的乘法和相加甚至不會出現在perf中。在許多平臺上使用硬件向量數學支持和/或批量複製值而不是一次一個地獲取數據將比贏得兩個標量操作更多的勝利。 – 2010-05-20 23:28:52