Как включить оптимизацию в G++ с помощью #pragma

Я хочу включить оптимизацию в G++ без параметра командной строки. Я знаю, что GCC может сделать это, написав #pragma GCC optimize (2) в моем коде. Но, похоже, это не сработает в G++.

эта страница может помочь:http://gcc.gnu.org/onlinedocs/gcc/Function-Specific-Option-Pragmas.html

моя версия компилятора:

$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
<suppressed copyright message>

$ gcc --version
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
<suppressed copyright message>

Я worte какой-то код, как это:

#pragma GCC optimize (2)
int main(){
    long x;
    x=11;
    x+=12;
    x*=13;
    x/=14;
    return 0;
}

и скомпилировал его с помощью GCC Не G++. Затем я использовал objdump, который вывод

08048300 <main>:
8048300:    55                      push   %ebp
8048301:    31 c0                   xor    %eax,%eax
8048303:    89 e5                   mov    %esp,%ebp
8048305:    5d                      pop    %ebp
8048306:    c3                      ret    
8048307:    90                      nop

когда я убрал #param GCC optimize(2) . выход objdump:

080483b4 <main>:
80483b4:    55                      push   %ebp
80483b5:    89 e5                   mov    %esp,%ebp
80483b7:    83 ec 10                sub    x10,%esp
80483ba:    c7 45 fc 0b 00 00 00    movl   xb,-0x4(%ebp)
80483c1:    83 45 fc 0c             addl   xc,-0x4(%ebp)
80483c5:    8b 55 fc                mov    -0x4(%ebp),%edx
80483c8:    89 d0                   mov    %edx,%eax
80483ca:    01 c0                   add    %eax,%eax
80483cc:    01 d0                   add    %edx,%eax
80483ce:    c1 e0 02                shl    x2,%eax
80483d1:    01 d0                   add    %edx,%eax
80483d3:    89 45 fc                mov    %eax,-0x4(%ebp)
80483d6:    8b 4d fc                mov    -0x4(%ebp),%ecx
80483d9:    ba 93 24 49 92          mov    x92492493,%edx
80483de:    89 c8                   mov    %ecx,%eax
80483e0:    f7 ea                   imul   %edx
80483e2:    8d 04 0a                lea    (%edx,%ecx,1),%eax
80483e5:    89 c2                   mov    %eax,%edx
80483e7:    c1 fa 03                sar    x3,%edx
80483ea:    89 c8                   mov    %ecx,%eax
80483ec:    c1 f8 1f                sar    x1f,%eax
80483ef:    89 d1                   mov    %edx,%ecx
80483f1:    29 c1                   sub    %eax,%ecx
80483f3:    89 c8                   mov    %ecx,%eax
80483f5:    89 45 fc                mov    %eax,-0x4(%ebp)
80483f8:    b8 00 00 00 00          mov    x0,%eax
80483fd:    c9                      leave  
80483fe:    c3                      ret    
80483ff:    90                      nop

однако он не будет работать с G++!

1 ответов


Это похоже на ошибку в g++ (48026 ошибка, ссылается на другую связанную проблему.)

в качестве обходного пути, вы можете пометить каждую функцию с __attribute__((optimize("whatever"))). Не большой.

int main() __attribute__((optimize("-O2")));
int main()
{
    long x;
    x=11;
    x+=12;
    x*=13;
    x/=14;
    return 0;
}
$ g++ -Wall -c t.c
$ objdump -d t.o

t.o:     file format elf64-x86-64


Disassembly of section .text.startup:

0000000000000000 <main>:
   0:   55                      push   %rbp
   1:   31 c0                   xor    %eax,%eax
   3:   48 89 e5                mov    %rsp,%rbp
   6:   5d                      pop    %rbp
   7:   c3                      retq