Как включить оптимизацию в G ++ с помощью #pragma - PullRequest
7 голосов
/ 17 февраля 2012

Я хочу включить оптимизацию в 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>

Я написал такой код:

#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    $0x10,%esp
80483ba:    c7 45 fc 0b 00 00 00    movl   $0xb,-0x4(%ebp)
80483c1:    83 45 fc 0c             addl   $0xc,-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    $0x2,%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    $0x92492493,%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    $0x3,%edx
80483ea:    89 c8                   mov    %ecx,%eax
80483ec:    c1 f8 1f                sar    $0x1f,%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    $0x0,%eax
80483fd:    c9                      leave  
80483fe:    c3                      ret    
80483ff:    90                      nop

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

1 Ответ

9 голосов
/ 17 февраля 2012

Похоже, это ошибка в 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   
...