質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Q&A

解決済

2回答

660閲覧

コンパイルの最適化オプションの違いについて

a.com

総合スコア871

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

0グッド

0クリップ

投稿2022/08/24 15:15

最適化オプションには-O2や-O0がありますが、実際にgdbでデバッグした場合に目に見えて違うのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2022/08/24 21:58

何が目に見えて違うかもしれないと考えてますか?
a.com

2022/08/25 02:38

ステップ実行したときの挙動などです。
guest

回答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

hidezzz

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

a.com

2022/08/29 13:01

ありがとうございます!なるほどです。
guest

0

最適化オプションには-O2や-O0がありますが、実際にgdbでデバッグした場合に目に見えて違うのでしょうか?

ちがいますよ

投稿2022/08/24 23:18

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

a.com

2022/08/25 02:37

具体的にはどこが違うのでしょうか?
y_waiwai

2022/08/25 03:08

まずは実際にやってみればいいかと。
a.com

2022/08/25 03:14

実際にデバッグしたのですが違いがわかりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問