Có thể thiết kế một trình biên dịch tối ưu hóa một vòng lặp trong đó các mảng được truy cập theo cách khác không? Ví dụ như thế này:
// int[] a,b
int sum = 0;
for(int i = 0; i < n; i++)
{
sum += a[i] + b[i];
}
Với lưu trữ mảng tuần tự thông thường, a[i]
và b[i]
có thể cách xa nhau trong bộ nhớ. Do đó, tôi nghĩ rằng tối ưu hóa trình biên dịch tốt sẽ phát hiện ra điều đó a[i]
và b[i]
luôn truy cập cùng lúc và lưu trữ các mảng xen kẽ, a[0] b[0] a[1] b[1] ...
để một truy cập bộ nhớ có thể truy xuất cả hai a[i]
và b[i]
.
a[i]
và b[i]
được truy xuất bằng một thao tác bộ nhớ, nhưng chúng được đặt gần đó trong bộ nhớ để có hiệu năng bộ đệm tốt hơn.