memcpy()通常比strcpy()快吗?

por*_*ton 17 c performance x86 memcpy strcpy

memcpy()通常速度比strcpy()(上最真实的平台)?(我假设字符串的大小是已知的.)

如果我正确地记得i386汇编程序,则会有loop指令复制给定数量的字节或单词.所以它是最快的方式,而strcpy()i386汇编程序实现将'\0'在一个简单的循环中使用手动检查.

所以我觉得在x86上memcpy()要快于strcpy().

其他架构是什么?

Bre*_*dan 23

如果您知道要复制的数据的大小,那么memcpy()应该比快速或更快strcpy().否则,memcpy()不能单独使用,strcpy()应该比strlen()后面快或快memcpy().

然而...

许多实现memcpy()和/或strcpy()和/或strlen()旨在有效地处理大量数据.这通常意味着额外的启动开销(例如,确定对齐,设置SIMD,缓存管理等),并使这些实现不好(缓慢)复制少量数据(这在编写良好的代码中更有可能).因此," 应该快或快 "并不一定意味着" 快或快 ".例如,对于少量数据,针对大量数据memcpy()优化的数据可能明显慢strcpy()于未针对大量数据优化的数据.

还要注意,这里的主要问题是通用代码(例如memcpy()strcpy())不能针对特定情况进行优化.最好的解决方案是拥有多个功能 - 例如memcpy_small(),它针对复制少量数据memcpy_large()进行了优化,并针对无法避免复制大量数据的错误代码进行了优化.

  • 我希望那些针对较大块优化的memcpy()版本将首先检查大小是否足够大,以使大块优化值得,如果不是,只需使用小块例程.可能是因为例如复制两个字符的字符串时strcpy的成本最终小于memcpy的成本,但我不会指望收支平衡点远远超过它. (4认同)

sup*_*cat 10

几乎在任何平台上,memcpy()都会比strcpy()复制相同数量的字节时更快.当字符串的最大允许大小远大于其实际大小时,唯一的时间strcpy()或其任何"安全"等价物将胜出memcpy().如果一个缓冲区可以容纳多达一百万个字符的字符串,并且想要将字符串复制到另一个百万字节的缓冲区,memcpy()则即使第一个缓冲区中的字符串只有两个字符,也必须复制一百万个字节长.strcpy()但是,该函数或其等价物能够提前退出,并且复制两个字符可能比memcpy()复制一百万个字符所需的时间更少.

  • 这取决于你是否告诉`memcpy`来复制整个缓冲区,或者你事先知道字符串的长度(也许它是单独存储在一个变量中),你可以告诉`memcpy`复制那么多. (8认同)
  • 好吧,如果你知道目标缓冲区至少和源缓冲区一样大,那么`strcpy`是安全的,即使你不知道实际字符串的长度.(假设字符串没有超出源缓冲区的末尾,在这种情况下,甚至在调用`strcpy`之前就会出现问题.) (3认同)
  • 除非你知道目标区域中的可用空间_and_源区域中使用的空间,否则`memcpy()`和`strcpy()`都不能安全使用.所以,你应该总是使用`memcpy()`,因为你应该总是知道你正在处理的字符串有多长. (2认同)
  • 对OP问题的任何答案都应该注意 strcpy 和 memcpy 不可互换,因此问题是不完整的......这取决于如何确定长度和/或数据是否包含 NUL。 (2认同)