结构复制的效率

Efficiency of struct copying

C中两个结构变量之间copy时,后端是memcpy还是逐项copy?这可以依赖于编译器吗?

它严重依赖编译器

考虑一个只有 2 个字段的结构

struct A { int a, b; };

在调试版本的 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]  

现在基本上完成了从 a 的地址到 b 的地址的 memcpy。

这在很大程度上取决于结构的布局、编译器、优化级别……很多因素。

你想都别想。编译器只需要它们生成的可观察结果与您要求的结果相同。除此之外,他们还可以按照自己喜欢的方式进行优化。这意味着您应该让编译器选择它复制结构的方式。

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

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