结构复制的效率
Efficiency of struct copying
C中两个结构变量之间copy时,后端是memcpy还是逐项copy?这可以依赖于编译器吗?
它严重依赖编译器
考虑一个只有 2 个字段的结构
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。
这在很大程度上取决于结构的布局、编译器、优化级别……很多因素。
你想都别想。编译器只需要它们生成的可观察结果与您要求的结果相同。除此之外,他们还可以按照自己喜欢的方式进行优化。这意味着您应该让编译器选择它复制结构的方式。
在低级优化的情况下,上述规则不适用的唯一情况。但这里适用其他规则:
- 切勿在早期开发阶段使用低级优化
- 只有在通过分析代码中的瓶颈来确定之后才做
- 始终使用基准测试来选择最佳方式
- 请记住,这种低级优化仅对一种架构上的一个(版本)编译器有意义。
C中两个结构变量之间copy时,后端是memcpy还是逐项copy?这可以依赖于编译器吗?
它严重依赖编译器
考虑一个只有 2 个字段的结构
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。
这在很大程度上取决于结构的布局、编译器、优化级别……很多因素。
你想都别想。编译器只需要它们生成的可观察结果与您要求的结果相同。除此之外,他们还可以按照自己喜欢的方式进行优化。这意味着您应该让编译器选择它复制结构的方式。
在低级优化的情况下,上述规则不适用的唯一情况。但这里适用其他规则:
- 切勿在早期开发阶段使用低级优化
- 只有在通过分析代码中的瓶颈来确定之后才做
- 始终使用基准测试来选择最佳方式
- 请记住,这种低级优化仅对一种架构上的一个(版本)编译器有意义。