我跑使用您所描述的语法instantianting数组一个简短的测试,发现使用非默认值实例化比使用默认值的实例化时间长2.2倍。
当我切换并使用默认值实例化时,大概需要相同的时间量。
事实上,当我查看反编译时,看起来会发生什么是数组被初始化,然后填充任何非默认值。
与非默认值的实例化:
bool[] abPrimes = new[] {
true, true
};
0000007e mov edx,2
00000083 mov ecx,79114A46h
00000088 call FD3006F0
0000008d mov dword ptr [ebp-64h],eax
00000090 mov eax,dword ptr [ebp-64h]
00000093 mov dword ptr [ebp-54h],eax
00000096 mov eax,dword ptr [ebp-54h]
00000099 cmp dword ptr [eax+4],0
0000009d ja 000000A4
0000009f call 76A9A8DC
000000a4 mov byte ptr [eax+8],1
000000a8 mov eax,dword ptr [ebp-54h]
000000ab cmp dword ptr [eax+4],1
000000af ja 000000B6
000000b1 call 76A9A8DC
000000b6 mov byte ptr [eax+9],1
000000ba mov eax,dword ptr [ebp-54h]
000000bd mov dword ptr [ebp-40h],eax
具有默认值的实例化:
bool[] abPrimes2 = new[] {
false, false
};
000000c0 mov edx,2
000000c5 mov ecx,79114A46h
000000ca call FD3006F0
000000cf mov dword ptr [ebp-68h],eax
000000d2 mov eax,dword ptr [ebp-68h]
000000d5 mov dword ptr [ebp-54h],eax
000000d8 mov eax,dword ptr [ebp-54h]
000000db mov dword ptr [ebp-5Ch],eax
有趣。我想知道这种'内存擦除'的方法来进行数组初始化是结构不支持显式默认构造函数或成员初始化函数的原因之一。这会使阵列初始化复杂化。 – LBushkin 2009-06-18 17:53:31
是的,这是很多。实际上,IL *中的结构支持无参数的构造函数,但它们只会在某些情况下被调用。 – 2009-06-18 17:59:35