単なる好奇心から..
タイトルにあるように、関数内で構造体を定義するための「ペナルティ」はありますか?(パフォーマンス、メモリ、悪いプログラミング慣行など)
PS関数内で(テンプレートではない)ファンクターを定義するのが一般的な方法であることは知っていますが、それでも..)
C ++ 11では、いいえ-ペナルティはありません。もちろん、そのファンクターを他の場所で再利用したい場合を除いて、実装の詳細で「より目に見える」スコープを汚染しないことは非常に良いスタイルだと思います。ただし、ラムダは本質的にこのアイデアの凝縮された形式であり、構造体をファンクターとして使用している場合は通常、ラムダが優先されます。あらゆる種類のデータについて、それは完全に問題ありませんが、通常はその点で競合しstd::pair
ますstd::tuple
。
C ++ 03では、このような構造体をテンプレートパラメーターとして使用することはできません。これらのパラメーターには外部リンクが必要なためです(ただし、Visual Studioではとにかくそれを行うことができます)。このような構造体を多形インターフェースで使用することは依然として有用です。
これは純粋に可視性の問題であるため、パフォーマンスやメモリのペナルティが発生するというもっともらしいシナリオを想像することはできません。
C ++ 03を使用している場合、技術的には、ローカルで定義された構造をテンプレート引数として使用することはできませんが、一部のコンパイラ(つまり、MSVC)では許可されています。
パフォーマンスについて質問されたことは承知していますが、別の問題について疑問に思っていました。C と C++ の両方を求めていますか、それともどちらか一方だけを求めていますか? スコープの目的で、または構造を非表示にするために、関数で構造を定義したいという大げさな推測をしています。
C の場合、別のモジュールで構造体を定義して宣言し、それらを静的にすることで、物事を隠すことができます。次に、C++ クラスのメンバーの場合と同じように、アクセス関数を提供できます。構造体にアクセスする必要があるモジュールの関数宣言を .h ファイルに含めます。
これが C++ の場合は、クラスを作成し、適切な get/set/manipulate メソッドを記述して、構造をプライベートまたはプロテクトにすると、残りの処理が行われます。
元の投稿を編集して、これを尋ねている理由を拡大した場合は、良い質問をしたことになります。