我有一个关于减少循环中内存调用次数的问题。请考虑以下代码(这不是我的代码,因为我太长了,因为它太长了):
for(k=0;k<n;k++)
{
y[k] = x[0]*2 + z[1];
}
如您所见,在每次迭代中,都会调用内存中的相同块(x [0],z [1])。我想知道在多次调用相同内存块时是否有任何方法可以减少内存访问。 提前谢谢。
答案 0 :(得分:6)
简单地说,在循环之前获取值:
i = x[0];
j = z[1];
for(k=0;k<n;k++)
{
y[k] = i*2 + j;
}
当然,编译器会对此进行优化(,如果它可以),即使你没有改变任何东西,但它有助于编写更易读和更直观的代码。您不需要在每次迭代时获取值,并且您编写的代码应该表明这一点 忘记微优化编写更直观,更易读的代码!
正如在评论中正确指出的那样,右手表达完全独立于循环,所以:
i = x[0]*2 + z[1];
for(k=0;k<n;k++)
{
y[k] = i;
}
答案 1 :(得分:2)
这是你能做的。
float value = x[0]*2 + z[1];
for(k=0;k<n;k++)
{
y[k] = value;
}
希望这会有所帮助。
答案 2 :(得分:1)
v = x[0]*2 + z[1];
for(k=0;k<n;++k) y[k] = v
假设x [0]和z [1]未映射到y [0..n-1]
答案 3 :(得分:1)
如果z
的类型短于int
(例如char
),您可以尝试以下方法:
char value = x[0]*2 + z[1];
unsigned int value32 = value | (value << 8) | (value << 16) | (value << 24);
unsigned int k;
// Going by blocks of 4
for(k = 0; k < n - n%4; k+=4) {
(unsigned int)z[k] = value32;
}
// Finishing loop
for(; k < n; k++) {
z[k] = value;
}
答案 4 :(得分:0)
编译器将对此进行优化,
但是如果您在没有优化的情况下使用损坏的编译器:您可以将它们都放在register
整数中,然后使用它们。像这样:
x0 = x[0]*2;
z1 = z[1];
y0 = x0 + z1;
register int k;
for(k=0;k<n;k++)
{
y[k] = y0;
}
这并不保证x [0]和z [1]将在寄存器上,但至少提示编译器它们应该在寄存器上。