我正在从基础知识学习C ++(使用Visual Studio Community 2015)
在处理数组时,我遇到了以下内容:
int main()
{
int i[10] = {};
}
汇总代码为:
18: int i[10] = {};
008519CE 33 C0 xor eax,eax
008519D0 89 45 D4 mov dword ptr [ebp-2Ch],eax
008519D3 89 45 D8 mov dword ptr [ebp-28h],eax
008519D6 89 45 DC mov dword ptr [ebp-24h],eax
008519D9 89 45 E0 mov dword ptr [ebp-20h],eax
008519DC 89 45 E4 mov dword ptr [ebp-1Ch],eax
008519DF 89 45 E8 mov dword ptr [ebp-18h],eax
008519E2 89 45 EC mov dword ptr [ebp-14h],eax
008519E5 89 45 F0 mov dword ptr [ebp-10h],eax
008519E8 89 45 F4 mov dword ptr [ebp-0Ch],eax
008519EB 89 45 F8 mov dword ptr [ebp-8],eax
这里,由于使用了初始化,因此每个int初始化为0(xor eax,eax)。这很清楚。
根据我所知,任何变量只有在使用时才会被分配内存(至少在现代编译器中),如果数组中的任何一个元素被初始化,整个数组将按如下方式分配内存:
int main()
{
int i[10];
i[0] = 20;
int j = 20;
}
汇编生成:
18: int i[10];
19: i[0] = 20;
00A319CE B8 04 00 00 00 mov eax,4
00A319D3 6B C8 00 imul ecx,eax,0
00A319D6 C7 44 0D D4 14 00 00 00 mov dword ptr [ebp+ecx-2Ch],14h
20: int j = 20;
00A319DE C7 45 C8 14 00 00 00 mov dword ptr [ebp-38h],14h
这里,编译器使用了4个字节(将值20
复制到i[0]
)但是根据我所知,整个数组的内存应该在line 19
分配。但是编译器没有为此生成任何相关的机器代码。它会在哪里存储信息(声明 其他9个元素[1-9] array i's
的剩余内存不能被其他变量使用 )< / p>
请帮助!!!