Да! GCC делает это на уровне оптимизации -O1
и выше, а clang делает это на уровне оптимизации -O2
и выше.
Я проверил это, используя этот код:
struct Matrix5x5 {
double values[5][5];
Matrix5x5() : values() {}
double trace() {
double sum = 0.0;
for(int i = 0; i < 5; i++) {
sum += values[i][i];
}
return sum;
}
};
double trace_of(Matrix5x5& m) {
return m.trace();
}
И это сборка, созданная gcc и clang:
trace_of(Matrix5x5&):
pxor xmm0, xmm0
addsd xmm0, QWORD PTR [rdi]
addsd xmm0, QWORD PTR [rdi+48]
addsd xmm0, QWORD PTR [rdi+96]
addsd xmm0, QWORD PTR [rdi+144]
addsd xmm0, QWORD PTR [rdi+192]
ret
Вы можете поиграться с кодом и посмотреть соответствующую сборку здесь: https://godbolt.org/z/p2uF0E.
Если вы перегрузите operator[]
, вам придется повысить уровень оптимизации до -O3
, но компилятор все равно сделает это: https://godbolt.org/z/JInIME