Part11: インライン関数

ことり「前回はラムダ式を見てみました。ちょっと難しいけど、使いこなせると便利な機能だよね」
凛「関数型っぽい書き方ができるのは面白いにゃ」
ことり「だけど、いいことずくめ、ではないんです。今回はラムダ式の欠点を補う、インライン関数を見てみましょう」


ことり「高階関数に関数を渡す場合、それは関数オブジェクトと呼ばれるオブジェクトの形になっています。オブジェクトは・・・えっと、次回かな」
凛「講義の順番難しいよね~」
ことり「関数リテラルは、コンパイルされるときはそれぞれが無名クラスになって・・・あ、無名クラスっていうのは、これも次回以降で・・・・・・えーいっ!」
凛「こ、ことりちゃんが色々投げた!」
ことり「とにかく、関数リテラルを扱う場合は、性能面でそれなりのオーバーヘッドが生じるんですっ!」
凛「そ、そうそう、細かい理屈は置いておくにゃ」
ことり「それで、例えば前回見たこんなコードだけど・・・」

ことり「これを関数リテラルを使わずに展開して書き直すと」

ことり「例が単純すぎるんだけど、こうなるよね」
凛「こうなると身も蓋もないにゃ」
ことり「この場合、関数リテラルを使わない方が実行時間やメモリの消費量の面で有利です。これは感覚的に分かるよね」
凛「なんとなく」
ことり「だけど、ラムダ式は再利用性とか拡張性を目的にして使われることも多いから、いくら性能面で有利だからってプログラマが全部展開するのはちょっと違うの」
凛「ラムダ式禁止!みたいなところに行き着いちゃいそうだもんね」
ことり「そこで、inlineというのが用意されています」

ことり「こう書くと、さっきみたいに手で展開したのと同じコンパイル結果が得られます」
凛「つまり、高階関数を見たらinlineを付けろ、ってこと?」
ことり「そうじゃないよ凛ちゃん。今度は生成されるコードの量が多くなるから、いいことばかりじゃないの」

ことり「インライン展開についてはもう少し細かい制御もできます。たとえば」

ことり「関数を2つ受け取るインライン関数があるけど、第2引数にはnoinlineが付いています。こうすると、第1引数はインライン展開して、第2引数はインライン展開しない、という制御ができます」
凛「何回も使われる小さい関数は性能を狙ってインライン化して、本体が大きい関数はコードサイズを抑えるためインライン化しない、って感じなんだね」

ことり「インライン関数についてはもう少しトピックがあるんだけど、まだ出てきてない言語機能に関するものだから、今回はここまでにしますね」

ことり「次回からはオブジェクト指向のお話です。ボリュームあるけど、頑張ろうね♪」
凛「気合い入れていくにゃ~っ!」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です