Assembly g++;程序集生成(变量顺序)

Assembly g++;程序集生成(变量顺序),assembly,g++,Assembly,G++,简单C代码的两个版本: int main(){ int array[4]; int i=0; array[4]=0; } 及 我用g++编译如下:g++-xc-S-masm=intel-fverbose asm-l-ctest.c 在这两个版本中,我得到了相同的assmebly代码: _main: LFB0: .cfi_startproc push ebp # .cfi_def_cfa_offset 8 .cfi_offset

简单C代码的两个版本:

int main(){

    int array[4];
    int i=0;
    array[4]=0;
}

我用g++编译如下:g++-xc-S-masm=intel-fverbose asm-l-ctest.c

在这两个版本中,我得到了相同的assmebly代码:

_main:
LFB0:
    .cfi_startproc
    push    ebp  #
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    mov ebp, esp     #,
    .cfi_def_cfa_register 5
    and esp, -16     #,
    sub esp, 32  #,
    call    ___main  #
    mov DWORD PTR [esp+28], 0    # i,
    mov DWORD PTR [esp+28], 0    # array,
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE0:
有人能解释一下原因吗?我的意思是I和数组的顺序不应该不同吗?
非常感谢你的帮助

没有什么理由。编译器可以按照自己的意愿对局部变量进行排序。声明它们的顺序与任何事情都无关。

为什么您认为它们应该不同?i和数组的顺序?它已更改,但未在汇编中。由于程序具有未定义的行为,因此绝对任何机器代码都将构成程序的正确实现。+1@KerrekSB,即使定义良好,编译器仍可以随意对局部变量排序。
_main:
LFB0:
    .cfi_startproc
    push    ebp  #
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    mov ebp, esp     #,
    .cfi_def_cfa_register 5
    and esp, -16     #,
    sub esp, 32  #,
    call    ___main  #
    mov DWORD PTR [esp+28], 0    # i,
    mov DWORD PTR [esp+28], 0    # array,
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE0: