ワナビーエンジニアのブログ

なんでもいいから文化的な生活を送りたい

void関数にreturnを書くや否や

void関数にreturnを書くや否や

  • きのこの山 vs たけのこの里
  • vim vs emacs
  • tab派 vs space派

等々、様々な信条の争いを見てきましたが、昨日仕事でコードレビューをしていた時ふと気づきがありました。 戻り値の無い関数(及びメソッド)の終端に、returnを書くか、書かないか、です。 どういうことかといいますと、

void func()
{
    do_something();

    return; // ←これ!
}

私は不必要なコードは書きたく無いので、return;書かない派に一票です。 ちなみにですが、下のようなコードで、処理の途中で抜けるためにreturnするのは普通に使います。

void func()
{
    if (is_return) return; // ← OK!

    do_something();

    return; // whyyyyy japaneeeeeeeese peeeooopleeeeee!?!?!!!111?
}

しかし、どうも弊社の私の周囲はreturn;書く派が多くて納得いかない。。くやしみ。。 そこで、twitterのアンケート機能を使ってアンケート中です。投票お願いします。


returnしないほうが良い事を考察してみる

ところで書く書かないで何か処理的な違いがあるのかな?と思ったので、 下のような簡単なコードを書いてアセンブラにしました。

①func.c
void func()
{
} 
②func_return.c
void func_return()
{
    return;
}

bash on ubuntu on windows環境でgcc -S func.c func_return.c実行。

func.s
        .file   "func.c"
        .text
        .globl  func
        .type   func, @function
func:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   func, .-func
        .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4"
        .section        .note.GNU-stack,"",@progbits
func_return.s
       .file   "func_return.c"
        .text
        .globl  func
        .type   func, @function
func:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        nop ★nopが挿入されている
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   func, .-func
        .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4"
        .section        .note.GNU-stack,"",@progbits

まとめ

注目すべきはreturn;する場合、アセンブラでnopが挿入されています。 つまり1step多いですね!冗長ですね!

そんなわけで、(少なくともC言語では)return;は書かないほうが良いのではないでしょうか。 震えながら強い方のリアクション待っております・・。