【问题标题】:Efficiency of struct copying结构复制的效率
【发布时间】:2016-03-04 07:40:34
【问题描述】:

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

【问题讨论】:

  • 它依赖于实现。但对我来说memcpy 看起来比逐项复制更有效。尝试使用您的编译器。
  • 事实上,我通常为这种情况做 memcpy。但现在我认为编译器可能足够聪明,可以在后面做一个 memcpy。因为它没有区别,并且比逐项复制更有效。
  • 今天的编译器很聪明。我会让编译器选择。对于像struct Point {int x; int y;} 这样的小型结构,编译器甚至可能只发出一两条move 指令,这比调用memcpy 效率高得多。
  • 他们一直很聪明,很长一段时间以来一直在使用“内置 memcpy”进行结构复制。

标签: c struct memcpy


【解决方案1】:

严重依赖编译器

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

struct A { int a, b; };

在 VS2015 中的 DEBUG 构建中复制此结构会生成以下 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是从a的地址到b的地址完成的。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2012-04-18
      • 2014-04-05
      • 2012-04-27
      • 2017-04-24
      • 1970-01-01
      相关资源
      最近更新 更多