C中好奇的string复制函数

当我读取nginx代码时,我已经看到了这个函数:

#define ngx_cpymem(dst, src, n) (((u_char *) memcpy(dst, src, n)) + (n)) static ngx_inline u_char * ngx_copy(u_char *dst, u_char *src, size_t len) { if (len < 17) { while (len) { *dst++ = *src++; len--; } return dst; } else { return ngx_cpymem(dst, src, len); } } 

这是一个简单的string复制function。 但是为什么它testingstring的长度,并切换到memcpy如果长度是> = 17?

这是一个优化 – 对于非常小的字符串,简单复制比调用系统(libc)复制功能更快。

使用while循环进行简单复制对于短字符串来说工作得相当快,而系统复制函数对长字符串进行(通常)优化。 但系统复制也做了很多检查和一些设置。

实际上,在这个代码之前,作者有一个评论:nginx,/ src / core / ngx_string.h(search ngx_copy)

 /* * the simple inline cycle copies the variable length strings up to 16 * bytes faster than icc8 autodetecting _intel_fast_memcpy() */ 

另外,两条线上是

 #if ( __INTEL_COMPILER >= 800 ) 

因此,作者做了测量并得出结论:ICC优化的memcopy会执行长时间的CPU检查来选择最优化的memcopy变体。 他发现手工复制16字节比ICC最快的memcpy代码快。

对于其他编译器,nginx直接使用ngx_cpymem (memcpy)

 #define ngx_copy ngx_cpymem 

作者为不同大小的不同memcpy进行了研究:

 /* * gcc3, msvc, and icc7 compile memcpy() to the inline "rep movs". * gcc3 compiles memcpy(d, s, 4) to the inline "mov"es. * icc8 compile memcpy(d, s, 4) to the inline "mov"es or XMM moves. */