FromNandの日記

自分的備忘録

戻り値がvoid型である関数で「return;」を書いた場合と書かない場合の違いについて

さて、前回の「main関数の「return 0;」について逆アセンブルして考察してみた - FromNandの日記」に続いて、今回はタイトルの通りの実験を行います。
まずは、「return;」を書いた場合のソースはこちらになります。

void func(void){
    return;
}


このプログラムをコンパイルして、逆アセンブルすると次のようになります。

00000000 <func>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   e8 fc ff ff ff          call   4 <func+0x4>
   8:   05 01 00 00 00          add    $0x1,%eax
   d:   90                      nop
   e:   5d                      pop    %ebp
   f:   c3                      ret


次は「return;」を書かないソースコードを紹介します。

void func(void){
}


このプログラムをコンパイルして、逆アセンブルすると次のようになります。

00000000 <func>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   e8 fc ff ff ff          call   4 <func+0x4>
   8:   05 01 00 00 00          add    $0x1,%eax
   d:   90                      nop
   e:   5d                      pop    %ebp
   f:   c3                      ret


さすがに「ret」がなくなるということはないみたいですね...
ということで、今回の結果としては「戻り値がvoid型である関数で「return;」を書いた場合と書かない場合の違いについて、違いはない」と言えそうです。
しかし、環境によっては差異がでる可能性もありますので注意してください。(とはいっても、retがなくなったら大惨事だから考えづらいけど...)
ちなみに、intなどのメモリを使用するデータ型を返す関数について「return ???;」を省くと、main以外の関数では未定義の動作になるみたいです。