Japanese

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のアンケート機能を使ってアンケート中です。投票お願いします。

そういえば今日社内で宗教戦争になりそうなのがあったのでアンケートしたい

void関数(orメソッド)の最後に…

— こうげ (@koooge) 2016年11月22日 [https://twitter.com/koooge/status/801077641184874496]

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;は書かないほうが良いのではないでしょうか。 震えながら強い方のリアクション待っております・・。