memcpy - strncpy/memcpy/memmove是逐字节还是以另一种有效方式复制数据?

标签 memcpy strcpy strncpy memmove effective-c++

众所周知,在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.

最佳答案

通常,您无需过多考虑memcpy或其他类似功能的实现方式。您应该假设它们是有效的,除非您的分析证明您做错了。

实际上,确实对其进行了优化。参见例如以下测试代码:

#include <cstring>

void test(char (&a)[8], char (&b)[8])
{
    std::memcpy(&a,&b,sizeof a);
}

使用g++ test.cpp -O3 -S -masm=intel命令使用g++ 7.3.0对其进行编译,我们使用can see以下汇编代码进行编译:
test(char (&) [8], char (&) [8]):

    mov     rax, QWORD PTR [rsi]
    mov     QWORD PTR [rdi], rax
    ret

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

关于memcpy - strncpy/memcpy/memmove是逐字节还是以另一种有效方式复制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54306591/

相关文章:

c++ - strncpy 到已经创建的 char []

c - 使用 memcpy 进行内联线程调度

c - 尝试复制到结构元素时出现 MEMCPY 段错误

c - memcpy 花费的时间在某个点后减少

C: 使用 strcpy 将字符串分配给结构数组导致的段错误

c - 在 C 中连接 8 个字符串形成 1 个字符串

c - memcpy: unix socket sun_path 起始地址索引

c - 使用 strcpy() 时出现段错误

c - 在我的例子中是 strncpy 或 strlcpy

c++ - 为什么 strncpy 不安全?