Я ищу класс 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, но безуспешно. Этот вид оптимизации был бы полезен для многих других подобных случаев.