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)
一般来说,您不必过多考虑如何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 字节读写。
归档时间: |
|
查看次数: |
2741 次 |
最近记录: |