Учитывая следующий код C, почему G CC (версия 10.1, x86-64, -O3) записывает в память внутри l oop вместо того, чтобы просто использовать два регистра во время суммирования и записывать результат в память только в конце?
void sum(unsigned int l, int *as, int *r) {
r[0] = 0;
r[1] = 0;
for (int i = 0; i < l; i++) {
r[0] += as[2 * i];
r[1] += as[2 * i + 1];
}
}
Сгенерированные инструкции здесь .
Я предполагаю, что это поведение связано с G CC, имеющим «в виду» параллелизм . У вас может быть другой поток, например, чтение из памяти по тому же адресу, пока выполняется суммирование. Это настоящая (и единственная) причина? Возможно, это вообще определено стандартом C?