C 中两个结构变量之间拷贝时,后端是memcpy 还是逐项拷贝?这可以依赖于编译器吗?
最佳答案
它在很大程度上依赖于编译器
考虑一个只有 2 个字段的结构
struct A { int a, b; };
在 DEBUG 构建的 VS2015 中复制此结构会生成以下 asm。
struct A b;
b = a;
mov eax,dword ptr [a]
mov dword ptr [b],eax
mov ecx,dword ptr [ebp-8]
mov dword ptr [ebp-18h],ecx
现在添加一个 100 字符的数组,然后复制它
struct A
{
int a;
int b;
char x[100];
};
struct A a = { 1,2, {'1', '2'} };
struct A b;
b = a;
mov ecx,1Bh
lea esi,[a]
lea edi,[b]
rep movs dword ptr es:[edi],dword ptr [esi]
现在基本上是从 a 的地址到 b 的地址完成一个 memcpy。
这取决于很多结构的布局、编译器、优化级别......很多因素。
关于c - 结构复制的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35790563/