内存引用
void f1(const int *a, int n, int *ans)
{
// int sum = *ans;
for (int i = 0; i < n; ++i)
{
*ans += a[i]; // remove
// sum += a[i];
}
*ans = sum;
}
// instead
void f2(const int *a, int n, int *ans)
{
int sum = *ans;
for (int i = 0; i < n; ++i)
{
// *ans += a[i];
sum += a[i];
}
*ans = sum;
}
顺序存储
1. 利用结构体
要访问的数据在两个数组中(不是连续存储的)
eg.
for (int i = 0; i < n; ++i)
{
a[i] = b[i];
}
可以利用结构体
struct Point
......
for (int i = 0; i < n; ++i)
{
Point.a[i] = Point.b[i];
}
2. 利用多维数组
eg. IPCC-21
before:
after:
可以利用一个二维的数组来代替多个不同的一维数组。
3. 按行访问
由于C/C++ 多维数组是以行主序存储在内存中
(存储完一行后再存储下一行)
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < cols; ++j)
{
// do ...
}
}
ps. Fortran多维数组是以列主序
其他技术
分块
分块之后且数据重用
一个循环切分成两层循环,改变访存的顺序,限定局部区域
循环合并 & 展开
合并注意前后数据有无联系
展开注意要利用好内存引用(利用好const)