使用 Keith 的示例代码。 GCC下的区别如下:
GCC 4.7.3:g++ -Wall -Wextra -std=c++0x -O3 -c array-fill.cpp
#include <algorithm>
#include <cstring>
int fref() {
int a[1024];
return a[512] - a[256]; }
int f1() {
int a[1024] = {};
return a[512] - a[256]; }
int f2() {
int a[1024];
std::memset(a, 0, sizeof(a));
return a[512] - a[256]; }
int f3() {
int a[1024];
std::fill(a, a + 100, 0);
return a[512] - a[256]; }
拆解
objdump -d 数组填充.o | c++filt
00000000 <fref()>:
0: b8 00 10 00 00 mov $0x1000,%eax
5: e8 00 00 00 00 call a <fref()+0xa>
a: 29 c4 sub %eax,%esp
c: 8b 84 24 00 08 00 00 mov 0x800(%esp),%eax
13: 2b 84 24 00 04 00 00 sub 0x400(%esp),%eax
1a: 81 c4 00 10 00 00 add $0x1000,%esp
20: c3 ret
21: eb 0d jmp 30 <f1()>
00000030 <f1()>:
30: 31 c0 xor %eax,%eax
32: c3 ret
33: 8d b6 00 00 00 00 lea 0x0(%esi),%esi
39: 8d bc 27 00 00 00 00 lea 0x0(%edi,%eiz,1),%edi
00000040 <f2()>:
40: b8 00 10 00 00 mov $0x1000,%eax
45: e8 00 00 00 00 call 4a <f2()+0xa>
4a: 29 c4 sub %eax,%esp
4c: 31 c0 xor %eax,%eax
4e: 81 c4 00 10 00 00 add $0x1000,%esp
54: c3 ret
55: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
59: 8d bc 27 00 00 00 00 lea 0x0(%edi,%eiz,1),%edi
00000060 <f3()>:
60: b8 00 10 00 00 mov $0x1000,%eax
65: e8 00 00 00 00 call 6a <f3()+0xa>
6a: 29 c4 sub %eax,%esp
6c: 89 e0 mov %esp,%eax
6e: 8d 94 24 90 01 00 00 lea 0x190(%esp),%edx
75: c7 00 00 00 00 00 movl $0x0,(%eax)
7b: 83 c0 04 add $0x4,%eax
7e: 39 d0 cmp %edx,%eax
80: 75 f3 jne 75 <f3()+0x15>
82: 8b 84 24 00 08 00 00 mov 0x800(%esp),%eax
89: 2b 84 24 00 04 00 00 sub 0x400(%esp),%eax
90: 81 c4 00 10 00 00 add $0x1000,%esp
96: c3 ret
C 风格的初始化 (f1) 在这种情况下当然允许优化!