strncpy/memcpy/memmove 是否逐字节或以其他有效方式复制数据?

Leo*_*eon 2 memcpy effective-c++ strcpy strncpy memmove

众所周知,在 x86/x86_64 等多字节字计算机中,逐字复制/移动大量内存(每步 4 或 8 个字节)比逐字节复制/移动更有效。

我很好奇 strncpy/memcpy/memmove 会以哪种方式做事,以及它们如何处理内存字对齐。

char buf_A[8], buf_B[8];

// I often want to code as this
*(double*)buf_A = *(double*)buf_B;

//in stead of this
strcpy(buf_A, buf_B);
// but it worsen the readability of my codes.
Run Code Online (Sandbox Code Playgroud)

Rus*_*lan 5

一般来说,您不必过多考虑如何memcpy或其他类似功能的实现。除非您的分析证明您错了,否则您应该假设它们是有效的。

在实践中,它确实得到了很好的优化。参见例如以下测试代码:

#include <cstring>

void test(char (&a)[8], char (&b)[8])
{
    std::memcpy(&a,&b,sizeof a);
}
Run Code Online (Sandbox Code Playgroud)

用g++ 7.3.0 用命令编译g++ test.cpp -O3 -S -masm=intel我们可以看到如下汇编代码:

test(char (&) [8], char (&) [8]):

    mov     rax, QWORD PTR [rsi]
    mov     QWORD PTR [rdi], rax
    ret
Run Code Online (Sandbox Code Playgroud)

如您所见,该副本不仅内联,而且还折叠为单个 8 字节读写。