memcpy()
通常比strcpy()
更快(在大多数真实平台上)吗? (我假设字符串的大小是已知的。)
如果我正确记得i386汇编程序,则会有loop
个指令复制给定数量的字节或单词。所以它是最快的方式,而strcpy()
i386汇编程序实现将在普通循环中使用'\0'
的手动检查。
所以我觉得在x86上memcpy()
比strcpy()
快。
其他架构是什么?
答案 0 :(得分:22)
如果您知道要复制的数据的大小,那么memcpy()
应该比strcpy()
更快或更快。否则,memcpy()
不能单独使用,strcpy()
应该比strlen()
跟memcpy()
一样快或更快。
...然而
memcpy()
和/或strcpy()
和/或strlen()
的大量实现旨在有效处理大量数据。这通常意味着额外的启动开销(例如,确定对齐,设置SIMD,高速缓存管理等)并使这些实现不好(慢)用于复制少量数据(这在编写良好的代码中更可能)。因此,“应该快或更快”并不一定意味着“快或快”。例如,对于少量数据,针对大量数据优化的memcpy()
可能明显慢于未针对大量数据进行优化的strcpy()
。
另请注意,此处的主要问题是通用代码(例如memcpy()
和strcpy()
)无法针对特定情况进行优化。最好的解决方案是拥有多种功能 - 例如memcpy_small()
针对复制少量数据进行了优化,memcpy_large()
针对无法避免复制大量数据的错误代码进行了优化。
答案 1 :(得分:10)
在几乎任何平台上,复制相同数量的字节时,memcpy()
将比strcpy()
更快。当字符串的最大允许大小远大于其实际大小时,strcpy()
或其任何“安全”等价物的唯一时间将优于memcpy()
。如果一个缓冲区可以容纳一个最多一百万个字符的字符串,并且想要将该字符串复制到另一个百万字节的缓冲区,那么即使第一个字符串中的字符串,memcpy()
也必须复制一百万个字节。缓冲区只有两个字符长。但是,strcpy()
函数或其等价函数可以提前退出,并且复制两个字符可能比memcpy()
复制一百万字符所需的时间更短。