使用for循环和struct指针复制数组的元素

时间:2014-07-20 19:20:38

标签: c arrays pointers struct

如果我有两个相同大小的数组,那么就说,

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]; 

它有任何性能差异吗?为什么呢?

我的第一个猜测是使用指针比使用循环更好,但我不确定。我试图进行网络搜索,但没有成功,可能是因为我找不到描述我想知道的确切词语。

3 个答案:

答案 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或类似的东西,但它可能比迭代数组快一点。在第二个注释中,您的编译器将使用迭代轻松优化两个数组之间的副本,因此差异可能可以忽略不计,并且不值得花费额外的努力来编写结构和指针。

所以,真正的问题是:你为什么需要这样的优化?