Optimization 编译器可以优化这段代码吗?

Optimization 编译器可以优化这段代码吗?,optimization,compiler-construction,Optimization,Compiler Construction,考虑以下代码片段: for(i = 0; i<10; i++) { int n = a[i];//first loop statement //other statements } for(i=0;i实际上,大多数编译器甚至在-O0时也会这样做: ~ $ cat t.c volatile int v; int a[10]; void f(void) { int n; int i; for(i = 0; i < 10; i++) { n =

考虑以下代码片段:

for(i = 0; i<10; i++)
{
    int n = a[i];//first loop statement

    //other statements
}

for(i=0;i实际上,大多数编译器甚至在
-O0
时也会这样做:

~ $ cat t.c
volatile int v;

int a[10];

void f(void)
{
  int n;
  int i;
  for(i = 0; i < 10; i++) {

    n = a[i];
    v = n;
  }
}
~ $ clang -S -O0 t.c
~ $ cat t.s
…
_f:                                     ## @f
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp2:
    .cfi_def_cfa_offset 16
Ltmp3:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp4:
    .cfi_def_cfa_register %rbp
    movl    $0, -8(%rbp)
LBB0_1:                                 ## =>This Inner Loop Header: Depth=1
    cmpl    $10, -8(%rbp)
    jge LBB0_4
## BB#2:                                ##   in Loop: Header=BB0_1 Depth=1
    movq    _v@GOTPCREL(%rip), %rax
    movq    _a@GOTPCREL(%rip), %rcx
    movslq  -8(%rbp), %rdx
    movl    (%rcx,%rdx,4), %esi
    movl    %esi, -4(%rbp)
    movl    -4(%rbp), %esi
    movl    %esi, (%rax)
## BB#3:                                ##   in Loop: Header=BB0_1 Depth=1
    movl    -8(%rbp), %eax
    addl    $1, %eax
    movl    %eax, -8(%rbp)
    jmp LBB0_1
LBB0_4:
    popq    %rbp
    ret
…
~ $ 
在这个新的编译版本中,
%esi
n



编译器实现“提升循环外变量声明”的方式即使是在最低级别的优化中,优化也是通过将所有块作用域自动变量的声明提升到函数作用域来实现的。这完全没有任何意义。此外,如果对目标语言没有最低限度的了解,那么对编译器优化的讨论就没有多大意义,因为在目标语言中,变量声明不需要产生任何结果代码。

实际上,大多数编译器即使在
-O0
上也会这样做:

~ $ cat t.c
volatile int v;

int a[10];

void f(void)
{
  int n;
  int i;
  for(i = 0; i < 10; i++) {

    n = a[i];
    v = n;
  }
}
~ $ clang -S -O0 t.c
~ $ cat t.s
…
_f:                                     ## @f
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp2:
    .cfi_def_cfa_offset 16
Ltmp3:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp4:
    .cfi_def_cfa_register %rbp
    movl    $0, -8(%rbp)
LBB0_1:                                 ## =>This Inner Loop Header: Depth=1
    cmpl    $10, -8(%rbp)
    jge LBB0_4
## BB#2:                                ##   in Loop: Header=BB0_1 Depth=1
    movq    _v@GOTPCREL(%rip), %rax
    movq    _a@GOTPCREL(%rip), %rcx
    movslq  -8(%rbp), %rdx
    movl    (%rcx,%rdx,4), %esi
    movl    %esi, -4(%rbp)
    movl    -4(%rbp), %esi
    movl    %esi, (%rax)
## BB#3:                                ##   in Loop: Header=BB0_1 Depth=1
    movl    -8(%rbp), %eax
    addl    $1, %eax
    movl    %eax, -8(%rbp)
    jmp LBB0_1
LBB0_4:
    popq    %rbp
    ret
…
~ $ 
在这个新的编译版本中,
%esi
n



编译器实现“提升循环外变量声明”的方式即使是在最低级别的优化中,优化也是通过将所有块作用域自动变量的声明提升到函数作用域来实现的。这完全没有任何意义。此外,如果对目标语言没有最低限度的了解,那么对编译器优化的讨论就没有多大意义,因为在目标语言中,变量声明不需要产生任何结果代码。

实际上,大多数编译器即使在
-O0
上也会这样做:

~ $ cat t.c
volatile int v;

int a[10];

void f(void)
{
  int n;
  int i;
  for(i = 0; i < 10; i++) {

    n = a[i];
    v = n;
  }
}
~ $ clang -S -O0 t.c
~ $ cat t.s
…
_f:                                     ## @f
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp2:
    .cfi_def_cfa_offset 16
Ltmp3:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp4:
    .cfi_def_cfa_register %rbp
    movl    $0, -8(%rbp)
LBB0_1:                                 ## =>This Inner Loop Header: Depth=1
    cmpl    $10, -8(%rbp)
    jge LBB0_4
## BB#2:                                ##   in Loop: Header=BB0_1 Depth=1
    movq    _v@GOTPCREL(%rip), %rax
    movq    _a@GOTPCREL(%rip), %rcx
    movslq  -8(%rbp), %rdx
    movl    (%rcx,%rdx,4), %esi
    movl    %esi, -4(%rbp)
    movl    -4(%rbp), %esi
    movl    %esi, (%rax)
## BB#3:                                ##   in Loop: Header=BB0_1 Depth=1
    movl    -8(%rbp), %eax
    addl    $1, %eax
    movl    %eax, -8(%rbp)
    jmp LBB0_1
LBB0_4:
    popq    %rbp
    ret
…
~ $ 
在这个新的编译版本中,
%esi
n



编译器实现“提升循环外变量声明”的方式即使是在最低级别的优化中,优化也是通过将所有块作用域自动变量的声明提升到函数作用域来实现的。这完全没有任何意义。此外,如果对目标语言没有最低限度的了解,那么对编译器优化的讨论就没有多大意义,因为在目标语言中,变量声明不需要产生任何结果代码。

实际上,大多数编译器即使在
-O0
上也会这样做:

~ $ cat t.c
volatile int v;

int a[10];

void f(void)
{
  int n;
  int i;
  for(i = 0; i < 10; i++) {

    n = a[i];
    v = n;
  }
}
~ $ clang -S -O0 t.c
~ $ cat t.s
…
_f:                                     ## @f
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp2:
    .cfi_def_cfa_offset 16
Ltmp3:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp4:
    .cfi_def_cfa_register %rbp
    movl    $0, -8(%rbp)
LBB0_1:                                 ## =>This Inner Loop Header: Depth=1
    cmpl    $10, -8(%rbp)
    jge LBB0_4
## BB#2:                                ##   in Loop: Header=BB0_1 Depth=1
    movq    _v@GOTPCREL(%rip), %rax
    movq    _a@GOTPCREL(%rip), %rcx
    movslq  -8(%rbp), %rdx
    movl    (%rcx,%rdx,4), %esi
    movl    %esi, -4(%rbp)
    movl    -4(%rbp), %esi
    movl    %esi, (%rax)
## BB#3:                                ##   in Loop: Header=BB0_1 Depth=1
    movl    -8(%rbp), %eax
    addl    $1, %eax
    movl    %eax, -8(%rbp)
    jmp LBB0_1
LBB0_4:
    popq    %rbp
    ret
…
~ $ 
在这个新的编译版本中,
%esi
n



编译器实现“提升循环外变量声明”的方式即使是在最低级别的优化中,优化也是通过将所有块作用域自动变量的声明提升到函数作用域来实现的。这完全没有任何意义。此外,如果对目标语言没有最低限度的了解,那么对编译器优化的讨论就没有多大意义,因为在目标语言中,变量声明不需要产生任何结果代码。

是否愿意提供更多细节说明您为什么关心?您真的认为构建编译器的团队无法看到立即想到的技巧?当然,您假设声明会产生任何代码。请记住,提升适用于可执行代码。如果构造不可执行,则没有什么可提升的。int变量C/C++中的able声明本身通常会导致零可执行代码。此外,如果不指定它适用于哪种语言,您的问题就太广泛了,因为在某些语言中,声明可能必须做些什么。您是否愿意提供更多详细信息来说明您为什么关心?您真的认为不可能立即想到一个技巧构建编译器的团队看到了吗?当然,你会假设声明会产生任何代码。记住提升适用于可执行代码。如果一个构造不是可执行的,那么就没有什么可提升的。C/C++中的int变量声明本身通常会导致零可执行代码。而且,你的问题在没有具体说明的情况下过于宽泛确定它适用于哪种语言,因为在某些语言中,可能声明必须做些什么。是否提供更多详细信息来说明您为什么关心?您真的认为构建编译器的团队无法看到立即想到的技巧?当然,您假定声明会生成任何代码。请记住对于可执行代码。如果一个构造不是可执行的,就没有什么可提升的。C/C++中的int变量声明本身通常会导致零可执行代码。此外,如果不指定它适用于哪种语言,您的问题就太广泛了,因为在某些语言中,声明可能必须做些什么。请提供更多详细信息这就是你关心的原因吗?你真的认为构建编译器的团队看不到一个瞬间浮现在脑海中的技巧吗?当然,你假设声明会产生任何代码。记住提升适用于可执行代码。如果一个构造不是可执行的,就没有什么可提升的。itsel在C/C++中的int变量声明f、 通常会导致零可执行代码。此外,如果不指定它适用于哪种语言,您的问题就太广泛了,因为在某些语言中,声明可能必须执行某些操作。