我使用 b 中的值来确定 a 的新值。它通过 while 循环检查数据是否收敛。
在这种情况下,如果您来回切换数组,您也许可以避免任何复制,就像这样(与您编写的内容相反;根据需要进行调整):
double array1[SIZE], array2[SIZE];
double* a = array1, double* b = array2;
generate_initial_values(array1);
for (;;)
{
// do either
memcpy(b, a, sizeof array1); // sizeof either array will do; *don't* use sizeof a or b, which is only the size of the pointer, not of the array
update_values_in_b(b);
// or, better:
produce_modified_values_in_b_from_a(a, b);
if (converged(a, b)) break;
// switch arrays
double* temp_ptr = a;
a = b;
b = temp_ptr;
}
如果适合你,第二种方式会更快。如果你必须使用 memcpy,你可以尝试Very fast memcpy for image processing? 中的东西,但可能对你来说最好的方法是使用 memcpy 并将编译器的优化级别设置得尽可能高。确保您 #include <string.h> 并且 memcpy 的 size 参数是编译时常量(它在上面),并查看生成的汇编代码以验证编译器是否内联副本。
编辑:等等,这是另一个想法,甚至不需要切换数组:
double a[SIZE], b[SIZE];
generate_initial_values(a);
for (;;)
{
produce_modified_values_in_second_array_from_first(a, b);
if (converged(a, b)) break;
produce_modified_values_in_second_array_from_first(b, a);
if (converged(b, a)) break;
}
当您退出循环时,您不知道哪个数组具有最新值,但如果它们已经收敛,您可能不在乎。如果你这样做了,你可以设置一个指向最新值的指针,或者使用一个函数:
void calling_function(void)
{
...
double a[SIZE], b[SIZE];
generate_initial_values(a);
double* great_values = get_great_values(a, b); // returns either a or b
...
}
double* get_great_values(double* a1, double* a2)
{
for (;;)
{
produce_modified_values_in_second_array_from_first(a1, a2);
if (converged(a1, a2)) return a2;
produce_modified_values_in_second_array_from_first(a2, a1);
if (converged(a2, a1)) return a1;
}
}