只初始化一个条目/索引时本地数组的内存分配?

时间:2017-06-05 13:07:01

标签: c++

我正在从基础知识学习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>

请帮助!!!

0 个答案:

没有答案