est ici une partie de mon code: (notez que M
est un grand nombre)Comment laisser le compilateur faire un mouvement de code invariant en boucle avec std :: map?
void myFunc(std::map<int, int>& myMap, int** arr) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
arr[i][j] = myMap[i] * j + i;
}
}
}
myMap[i]
est un invariant de boucle dans la boucle interne. Donc je pense que gcc le sortira automatiquement de la boucle interne quand j'utiliserai -O1
. Mais ça ne marche pas. Depuis quand je me déplace manuellement comme suit:
void myFunc(std::map<int, int>& myMap, int** arr) {
for (int i = 0; i < N; i++) {
int tmp = myMap[i];
for (int j = 0; j < M; j++) {
arr[i][j] = tmp * j + i;
}
}
}
L'exécution est bien meilleure que la première version.
Peut-être que le compilateur pense myMap
modifierait la carte de sorte qu'il choisit de ne pas faire l'optimisation. Mais je suis sûr que je veux juste lire la valeur de myMap
et ne le modifiera pas. Comment puis-je faire comprendre au compilateur?
Si la clé n'existe pas dans 'myMap', elle sera créée dans l'appel' myMap [i] '. Alors, comment le compilateur devrait-il savoir si le contenu de 'myMap' est inchangé après la première et chaque itération suivante? –
Cela ne peut fonctionner que si 'myMap' est un' const & 'et même alors je ne suis pas sûr. –