Je recherche une classe matricielle 2D (ou bitmap) flexible mais aussi rapide. Le contenu Une classe souple devrait vous permettre de choisir les dimensions au cours de l'exécution, et ressemblerait à quelque chose comme ça (simplifié):Optimisation d'une classe matricielle/bitmap 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;
};
Une solution plus rapide souvent proposée en utilisant des modèles est (simplifié):
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;
};
C'est plus rapide car la largeur peut être "inline" dans le code. La première solution ne le fait pas. Cependant, ce n'est plus très flexible, car vous ne pouvez plus changer la taille à l'exécution. Donc ma question est: Existe-t-il une possibilité de dire au compilateur de générer du code plus rapide (comme lors de l'utilisation du template), quand la taille du code est fixe et génère du code flexible quand son runtime dépend?
J'ai essayé d'y parvenir en écrivant "const" là où c'est possible. Je l'ai essayé avec gcc et VS2005, mais sans succès. Ce type d'optimisation serait utile pour de nombreux autres cas similaires.
"Ce type d'optimisation serait utile pour de nombreux autres cas similaires." Est-ce que vous dites cela basé sur des tests réels, ou simplement sur vos croyances? Rappelez-vous, l'optimisation prématurée et tout cela. –
Avez-vous profilé ce code? Pour tout ce qui n'est pas intégré, il est peu probable que la multiplication et l'addition supplémentaires apparaissent même dans perf. Sur de nombreuses plates-formes, l'utilisation de la prise en charge mathématique du vecteur matériel et/ou la copie de valeurs en masse plutôt qu'une à la fois vous permettra de gagner beaucoup plus que d'essayer de vous débarrasser de deux opérations scalaires. –