在C中的两个结构变量之间进行复制时,在后端是复制memcpy还是逐项复制?这可以编译器依赖吗?
答案 0 :(得分:4)
它依赖于编译器
考虑只有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]
现在基本上是一个memcpy是从地址到b的地址完成的。
这取决于结构的大部分布局,编译器,优化级别......很多因素。
答案 1 :(得分:2)
你甚至不应该考虑这一点。编译器只需要它们生成的可观察结果与您要求的相同。除此之外,他们还可以优化自己喜欢的方式。这意味着您应该让编译器选择复制结构的方式。
在低级别优化的情况下,上述规则不适用的唯一情况。但这里适用其他规则: