gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:27:25 31 4
gpt4 key购买 nike

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com