這裏是我的代碼部分:(注意M
是一個大的數字)如何讓編譯器用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]
是在內部循環的循環不變。所以我認爲當我使用-O1
時,gcc會自動將它移出內部循環。但它不起作用。因爲當我手動移動如下:
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;
}
}
}
運行時比第一個版本好得多。
也許編譯器認爲myMap
會修改地圖,因此它選擇不進行優化。但我確定我只想讀取myMap
的值,並且不會修改它。我如何讓編譯器理解?
如果key不存在於myMap中,它將在myMap [i]'調用中創建。那麼編譯器應該知道在第一次和每次下一次迭代之後'myMap'內容是否保持不變? –
這隻能在'myMap'是一個'const&'時才能起作用,即使這樣我也不確定。 –