2011-10-11 48 views
6

C++(特にVSVC++ 2008)では、メソッド内で構造体をインラインで宣言できます。 は、例えば:インライン構造体宣言

MyClass::method() 
{ 
struct test{ int x;}; 
test t = {99}; 
} 

私の質問は、どのようにこの宣言の仕事は、内部、および具体的には、任意の負のパフォーマンスに影響を持っていないんですか?

+0

[C++関数のローカルクラスの使い方](http://stackoverflow.com/questions/5714616/usage-of-local-class-in-c-function) – Nawaz

+0

これはローカルクラスと呼ばれています。それについては、[可能な重複](http://stackoverflow.com/questions/5714616/usage-of-local-class-in-c-function)を参照してください。 – Nawaz

答えて

6

この宣言は内部的にどのように機能しますか?

名前空間が宣言されているブロックのスコープ(この場合は関数本体)内でのみ表示される点を除いて、名前空間スコープの宣言とまったく同じです。 UPDATE:@Nawazが指摘しているように、ローカルクラスには1つまたは2つの追加の制限があります。静的なデータメンバーを持つことはできません。(C++ 03ではC++ 11ではなく)テンプレート型引数。

パフォーマンスに負の影響はありませんか?

いいえ、スコープ(コードがコンパイルされるかどうかにのみ影響します)以外は、他のクラス定義と同じです。

+2

正解ではありません。ローカルクラスと名前空間クラスには多くの違いがあります。可能性のある重複を参照してください:http://stackoverflow.com/questions/5714616/usage-of-local-class-in-c-function – Nawaz

+0

@Nawaz:ありがとう、私は少し単純化し、私は実際に静的なデータメンバーを持つことができませんでした。私は答えがより正しいと思います。 –

0

関数内のstruct宣言が各呼び出しの後で負のコストとなり、CPU時間がかかると考えると間違っています。コンパイラはコンパイル時にそれを処理し、関数の中でstructが宣言されているようですが(範囲は限られています)。

2

関数スコープ内またはスコープ外の型を定義する主な違いは、スコープです。つまり、関数内で定義されていれば、関数外ではアクセスできません。

他の違いはありますが(少なくともC++ 03ではC++ 11を再チェックしませんでした)、静的メンバーまたはテンプレートメンバーをローカルクラスに持つことはできません。このローカルクラスを引数の1つとして使用することはできません(この制限はC++ 11では削除されています)。IIRCこれは、ローカルクラスに内部リンケージ(名前空間レベルクラスの外部ではなく)があり、外部リンケージの議論。

関連する問題