最適化オプションには-O2や-O0がありますが、実際にgdbでデバッグした場合に目に見えて違うのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
何が目に見えて違うかもしれないと考えてますか?
2022/08/25 02:38
ステップ実行したときの挙動などです。
回答2件
0
ベストアンサー
一例として、以下のようなソースコードで2種類の最適化オプションでビルドし、それぞれをgdbによるステップ実行をしてみました。。
「-O0」の場合、ステップ実行すると1行ずつ実行されていることが確認できますが、
「-O2」の場合、最適化処理によって定数要素のみで構成されるループ計算は不要と判断され、計算ループ処理そのものが無くなってしまっています。
テストソースコード
C
1$ cat hoge.c 2#include <stdio.h> 3#include <stdlib.h> 4#include <unistd.h> 5 6int main( void ) { 7 int i; 8 int const_value = 11; 9 int sum = 0; 10 11 /* 定数要素のみの計算ループ。「-O2」の場合はループ処理をせずに結果を求めるように最適化される */ 12 for ( i = 0 ; i < 3 ; ++i ) { 13 14 sum += const_value; 15 } 16 17 printf( "sum=%d\n", sum ); 18 19 20 return 0; 21}
「-O0」オプションを付けてビルドしたバイナリをgdbでステップ実行
$ gcc -O0 -g hoge.c -o hoge0 $ gdb hoge0 GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1 … (中略) … (gdb) break main Breakpoint 1 at 0x652: file hoge.c, line 7. (gdb) r Starting program: /tmp/hoge01/hoge0 Breakpoint 1, main () at hoge.c:7 7 int const_value = 11; (gdb) n 8 int sum = 0; (gdb) 11 for ( i = 0 ; i < 3 ; ++i ) { (gdb) 13 sum += const_value; (gdb) 11 for ( i = 0 ; i < 3 ; ++i ) { (gdb) 13 sum += const_value; (gdb) 11 for ( i = 0 ; i < 3 ; ++i ) { (gdb) 13 sum += const_value; (gdb) 11 for ( i = 0 ; i < 3 ; ++i ) { (gdb) 16 printf( "sum=%d\n", sum ); (gdb) sum=33 19 return 0; (gdb) 20 }
「-O2」オプションを付けてビルドしたバイナリをgdbでステップ実行
$ gcc -O2 -g hoge.c -o hoge2 $ gdb hoge2 GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1 … (中略) … (gdb) break main Breakpoint 1 at 0x560: file /usr/include/x86_64-linux-gnu/bits/stdio2.h, line 104. (gdb) r Starting program: /tmp/hoge01/hoge2 Breakpoint 1, main () at hoge.c:16 16 printf( "sum=%d\n", sum ); (gdb) n 5 int main( void ) { (gdb) 16 printf( "sum=%d\n", sum ); (gdb) sum=33 20 }
投稿2022/08/29 12:39
総合スコア1248
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。