memcpy vs C中的赋值

Set*_*jmp 23 c struct variable-assignment memcpy

在什么情况下我应该期望memcpys在现代INTEL/AMD硬件上的性能优于其他?我在32位Intel平台上使用GCC 4.2.x(但我对64位感兴趣).

Joh*_*itb 35

你永远不应该指望他们胜过任务.原因是,当编译器认为它更快时(如果使用优化标志),编译器将使用memcpy.如果不是,并且如果结构合理小,它适合寄存器,则可以使用直接寄存器操作,根本不需要任何存储器访问.

GCC内部有特殊的块移动模式,可以确定何时直接更改寄存器/存储单元,或何时使用memcpy功能.注意在分配结构时,编译器在编译时知道移动的大小,因此它可以展开小副本(例如,在行中移动n次而不是循环).注意-mno-memcpy:

-mmemcpy
-mno-memcpy
    Force (do not force) the use of "memcpy()" for non-trivial block moves.  
    The default is -mno-memcpy, which allows GCC to inline most constant-sized copies.
Run Code Online (Sandbox Code Playgroud)

谁知道何时使用memcpy比编译器本身更好?

  • 请注意,反向可以应用 - 至少在GCC中,小常量大小的memcpy被复制指令替换,如果与指向小源和/或目标的指针一起使用,则*不*防止一个或两个被优化为寄存器.所以:用最简单的代码做任何事情. (4认同)
  • 你不应该指望一个人胜过另一个人.如果您遇到性能问题,您应该对其进行分析,看看assign/memcpy是否是问题,如果是,请尝试更改它们以使用另一个,并查看它是否表现更好.更多分析,更少猜测.;) (4认同)
  • 永远不要说永远......我们在使用软件未对齐异常处理程序的嵌入式处理器上做了一些工作.我们发现结构赋值(使用指针)经常导致未对齐的异常,而memcpy则没有.异常的代价非常高,因此在内存不一定对齐的情况下,memcpy比赋值快很多. (4认同)