在C中的两个结构变量之间进行复制时,在后端是复制memcpy还是逐项复制?这能被编译器依赖吗?
发布于 2016-03-04 08:01:12
它严重依赖于编译器
考虑一个只有两个字段的结构
struct A { int a, b; };在调试版本中在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。
它取决于结构的布局,编译器,优化的水平,很多因素。
发布于 2016-03-04 08:30:22
你甚至不应该去想这个。编译器只需要它们生成的可观察到的结果与您所要求的相同。此外,他们可以优化他们喜欢的方式。这意味着您应该让编译器选择其复制结构的方式。
上述规则不适用于低级别优化的唯一情况。但在这方面适用其他规则:
https://stackoverflow.com/questions/35790563
复制相似问题