2016-09-27 16 views
2

私は内部でヘルパー関数を使用して体を整理してきれいに保ちます。彼らは非常にシンプルです(しかし、必ずしも短くはありません)(彼らは2以上です)、関数の本体の内部に簡単にインライン展開することができますが、私はそうしたくありません。その機能の体を整理しておく。ヘルパー関数:lambdasと通常の関数

すべてのこれらの関数は、参照することにより、いくつかの引数を渡され、それらを変更する必要がある、と私は、2つの方法(愚かな例)でそれらを書くことができます。通常の機能で

void helperf1(int &count, int &count2) { 
    count += 1; 
    count2 += 2; 
} 

int helperf2 (int &count, int &count2) { 
    return (count++) * (count2--); 
} 

//actual, important function 
void myfunc(...) { 
    int count = count2 = 0; 

    while (...) { 
     helperf1(count, count2); 
     printf("%d\n", helperf2(count, count2)); 
    } 
} 

か上記の例で明示的に渡した引数を取り込むラムダ関数を使っています:

void myfunc(...) { 
    int count = count2 = 0; 

    auto helperf1 = [&count, &count2]() -> void { 
     count += 1; 
     count2 += 2; 
    }; 

    auto helperf2 = [&count, &count2]() -> int { 
     return (count++) * (count2--); 
    }; 

    while (...) { 
     helperf1(); 
     printf("%d\n", helperf2()); 
    } 
} 

ただし、私はどのような方法を使うべきかはわかりません。最初のものでは、引数を渡す "オーバーヘッド"がありますが、2番目の引数は既にそこに含まれているので、 "オーバーヘッド"が削除されます。しかし、彼らはまだラムダ関数であり、通常の関数ほど高速ではないはずです。

どうすればよいですか?最初の方法を使用しますか? 2番目のものを使用しますか?または、読みやすさを犠牲にして、主要機能の本体でインライン化するだけですか?

+1

'helperf1'と' helperf2'の両方がおそらくインライン化されるため、オーバーヘッドは発生しません。 – Zereges

+0

ラムダ版の@Zeregesもありますか? – user6245072

+1

誰かが_premature optimization_をお伝えしましたか? – skypjack

答えて

1

あなたの最も重要なことは、読みやすさと保守性です。 正規またはラムダ関数のどちらが読みやすくなるかは、与えられた問題(および読者/管理者の好みに少し依存する)に大きく依存します。

そのパフォーマンスがわかるまでパフォーマンスについて心配しないでください。実際にはが問題です。パフォーマンスの場合は、どのインプリメンテーションが高速であるかを推測するのではなく、ベンチマークによって開始します(多くの場合、コンパイラは最適化にかなり優れています)。

0

パフォーマンス上の理由から、実際の問題はありません。決定するものは何でも、何でも選択してください。

しかし、ラムダ式は、あなたが望む目的のためにあなたに何の恩恵も与えません。 彼らはコードをどんなクリーナーにもしません。

実際、私は、これらのヘルパー関数を持つ素敵な電卓オブジェクトに比べて、きれいなセマンティクスとインターフェースで適切に名前が付けられたメンバー関数としてコードを読むのが少し難しくなると考えています。ラムダを使用して

0

は、より読みやすいですが、彼らはより深刻な理由のためにそこに実際にある、ラムダ式は、「無名関数」として知られており、特定のプログラミングパラダイムに非常に有用であり、特に関数型プログラミング、ラムダ計算(http://en.wikipedia.org/wiki/Lambda_calculus)されている

ここでは、ラムダを使用しての目標を見つけることができます:あなたがそれらのいずれかを呼び出す場合は、あなたのラムダメソッドを使用し、その後、あなたのコード内のどこか別の2つのヘルパー関数を必要としませんが、場合
https://dzone.com/articles/why-we-need-lambda-expressions

をあなたのプロジェクトのどこかで、lambd "ヘルパー(h/hpp)"というヘッダファイルを作ることができます& "helper"というソースファイルです。(c/cpp)」を入力してヘルパーファイルと呼び出し元ファイルの両方の可読性を取得します

この未熟な習慣を回避し、読んだ複雑なコードプログラムのスキルが向上し、チームで作業している場合は問題にはなりません。コメントを使用すると、プログラミングスキルを尊重することができます。

パフォーマンスクリティカルなアルゴリズムを書くまでパフォーマンスは心配しないでください。そうでなければ、その差は数ミリ秒で、それに気づかないでください。コンパイラがコードを最適化するように頼んだら、ほとんどの場合、コンパイラが実行できる最適化に時間を費やします。

関連する問題