如果我有两个相同大小的数组,那么就说,
int pa1[100];
int pa2[100];
我知道如果在代码中的某个时刻,我想在pa1中复制pa2的内容,
pa1 = pa2;
不是正确的方法。相反,我可以使用一个循环。但是我想如果我有两个结构指针(ps1,ps2),那么编写它是有效的:
*ps1 = *ps2;
如果该结构包含100个int数组,并且我将ps1和ps2分别指向pa1和pa2,那么前一条指令与复制数组中每个元素的循环之间有什么区别?
for (int i = 0; i<100; i++) pa1[i] = pa2[i];
它有任何性能差异吗?为什么呢?
我的第一个猜测是使用指针比使用循环更好,但我不确定。我试图进行网络搜索,但没有成功,可能是因为我找不到描述我想知道的确切词语。
答案 0 :(得分:1)
通常编译器在这种情况下使用标准C函数memcpy
。它比使用手动编写的循环要快得多。
答案 1 :(得分:1)
是的,它有效,如下面的程序所示。
不,你不能确定编译器将在内部选择的代码。但是编译器很可能会发出一个非常有效的代码,比如调用memcopy(但不需要包含)或者使用优化的程序集。
但它无法得到保证。您必须测试或分析生成的汇编输出。
在可读性部分,我认为复制结构至少与显式循环或对memcopy的调用一样容易阅读。如果两个数组同时伴随着与阵列相关的其他变量,也可能会更好地进入结构。
#include <stdio.h>
int main() {
struct {
int t[10];
} s1, s2;
int i = 0;
for(i=0; i < 10 ; ++i){
s1.t[i] = i;
s2.t[i] = -1;
}
printf("s1 [%d %d ... %d %d] s2 [%d %d ... %d %d]\n",
s1.t[0], s1.t[1], s1.t[8], s1.t[9],
s2.t[0], s2.t[1], s2.t[8], s2.t[9]);
s2 = s1;
printf("s1 [%d %d ... %d %d] s2 [%d %d ... %d %d]\n",
s1.t[0], s1.t[1], s1.t[8], s1.t[9],
s2.t[0], s2.t[1], s2.t[8], s2.t[9]);
}
答案 2 :(得分:0)
你是说这个?
int pa1[100], pa2[100];
int *ps1 = pa1, *ps2 = pa2;
// Initialize the arrays
*ps1 = *ps2;
如果是,那么最后一行所做的就是:
pa1[0] = pa2[0];
别无其他。
如果您需要将数组的所有元素复制到另一个元素,将需要遍历它们。
编辑:第二次阅读,现在我认为你的意思是:
struct a{
int v[100];
};
int pa1[100], pa2[100];
a *ps1, *ps2;
// Initialize the arrays
ps1 = (a*)pa1;
ps2 = (a*)pa2;
*ps1 = *ps2;
非常聪明,虽然你找不到明确的答案。这是特定于实现的,尽管很多实现似乎都使用memcpy或类似的东西,但它可能比迭代数组快一点。在第二个注释中,您的编译器将使用迭代轻松优化两个数组之间的副本,因此差异可能可以忽略不计,并且不值得花费额外的努力来编写结构和指针。
所以,真正的问题是:你为什么需要这样的优化?