2012-02-17 50 views
6

Tôi muốn bật tối ưu hóa trong g ++ mà không có tham số dòng lệnh. Tôi biết GCC có thể làm điều đó bằng cách viết #pragma GCC optimize (2) trong mã của tôi. Nhưng có vẻ như nó sẽ không hoạt động trong G ++.Cách bật tối ưu hóa trong G ++ với #pragma

Trang này có thể giúp: http://gcc.gnu.org/onlinedocs/gcc/Function-Specific-Option-Pragmas.html

trình biên dịch của tôi phiên bản:

$ 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> 

Tôi worte một số mã như thế này:

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

Và biên dịch nó với GCC Không G ++. Sau đó, tôi đã sử dụng objdump, xuất ra

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 

Khi tôi xóa #param GCC optimize(2). đầu ra 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 

Tuy nhiên, nó sẽ không hoạt động với G ++!

+0

gì _version_ của GCC bạn đang sử dụng? – ildjarn

+2

Bạn thấy điều gì khiến bạn nghĩ rằng nó không hoạt động? Là nhị phân sản xuất cùng có và không có #pragma? – jcopenha

+0

Tôi sử dụng objdump để kiểm tra xem mã nhị phân có được đơn giản hóa hay không. – Kaoet

Trả lời

8

này dường như là một lỗi trong g++ (Bug 48026, tài liệu tham khảo một vấn đề khác có liên quan.)

Là một khắc phục, bạn có thể đánh dấu từng chức năng với __attribute__((optimize("whatever"))). Không tốt.

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