结构复制的效率

时间:2016-03-04 07:40:34

标签: c struct memcpy

在C中的两个结构变量之间进行复制时,在后端是复制memcpy还是逐项复制?这可以编译器依赖吗?

2 个答案:

答案 0 :(得分:4)

它依赖于编译器

考虑只有2个字段的结构

struct A { int a, b; };

在DEBUG构建中在VS2015中复制此结构会生成以下asm。

struct A b;

b = a;

mov         eax,dword ptr [a]  
mov         dword ptr [b],eax  
mov         ecx,dword ptr [ebp-8]  
mov         dword ptr [ebp-18h],ecx  

现在添加了一个包含100个字符的数组,然后复制

struct A
{
    int a;
    int b;
    char x[100];
};

struct A a = { 1,2, {'1', '2'} };
struct A b;

    b = a;

mov         ecx,1Bh  
lea         esi,[a]  
lea         edi,[b]  
rep movs    dword ptr es:[edi],dword ptr [esi]  

现在基本上是一个memcpy是从地址到b的地址完成的。

这取决于结构的大部分布局,编译器,优化级别......很多因素。

答案 1 :(得分:2)

你甚至不应该考虑这一点。编译器只需要它们生成的可观察结果与您要求的相同。除此之外,他们还可以优化自己喜欢的方式。这意味着您应该让编译器选择复制结构的方式。

在低级别优化的情况下,上述规则不适用的唯一情况。但这里适用其他规则:

  • 从不在早期开发阶段使用低级优化
  • 只有在通过分析代码中的瓶颈进行识别后才能做到
  • 始终使用基准测试来选择最佳方式
  • 请记住,这种低级优化只对一个架构上的一个(版本)编译器有意义。