2011-12-15 8 views
9

私は、クラスのサイズの制限は何かと思っていました。私は簡単なテストをした:クラスのサイズ制限はいくらですか?

それは

でコンパイルに失敗し

#define CLS(name,other) \ 
class name\ 
{\ 
public: \ 
name() {};\ 
    other a;\ 
    other b;\ 
    other c;\ 
    other d;\ 
    other e;\ 
    other f;\ 
    other g;\ 
    other h;\ 
    other i;\ 
    other j;\ 
    other k;\ 
}; 

class A{ 
    int k; 
public: 
    A(){}; 
}; 

CLS(B,A); 
CLS(C,B); 
CLS(D,C); 
CLS(E,D); 
CLS(F,E); 
CLS(G,F); 
CLS(H,G); 
CLS(I,H); 
CLS(J,I); 

" 'J':クラスが大きすぎる"

私は、最終的な宣言削除する場合 - CLS(J,I);を、それすべてコンパイルされます。

これはコンパイラに課せられた制限ですか、それとも標準のどこかにありますか?

+0

最後に、Jクラスの約10 GB(パディングに応じて)に達します。 – dalle

+0

私はただそれを宣言していましたが、実際には使用していませんでした。私はいくつかのHクラスの配列を宣言することは、ランタイムを破るだろう:) –

答えて

14

これは附属書B.実装は制限を課すことができるが、それらは、少なくともすべきである:オブジェクトの

  • サイズ[262 144]。
  • 単一クラスのデータメンバー[16 384]。
  • メンバーは単一のクラス[4 096]で宣言されています。それはおそらく拠点と私のものを含めて、二番目は確かにメンバーであることを示しているという理由だけで三番目は、あなたが使用している工事の種類に直接関係ない

は、私はそれを言及しますメンバーのメンバーについては分かりません。しかし、ただ一つのクラス定義にリストされているメンバーだけではありません。

Iを受け入れますが、Jを受け入れないため、2^31データメンバー、またはサイズ2^32を実装しているように見えます。コンパイラが、SIZE_MAXより大きいクラスのクラスを考慮することを拒否することは、たとえプログラムがそれをインスタンス化しない場合でも、型にsizeofを使用したとしても、明らかに合理的です。したがって、コンパイラの最善の努力をしても、32ビット実装でこれが動作することは期待できません。

「これらの量はガイドラインに過ぎず、準拠性を決定しません」ということに注意してください。一致する意味は、より大きな数を使用するプログラムをコンパイルするのに十分なリソースがある場合でも、適合の最小限の制限はありません。

厳密にはリソースの制限が小さいため、準拠している実装が役に立たないというさまざまな機会がC++標準であるため、これが別の場合には追加の害はありません。

C++ 03と同じ多かれ少なかれある:

  • オブジェクトのサイズ[262 144]。
  • 単一のクラス、構造体、または共用体のデータメンバー[16 384]。
  • メンバーは単一のクラス[4 096]で宣言されています。
+0

パーフェクト、ありがとう。 @Steve Jessop。 –

+0

附属書Bは標準ではないことに注意してください。そこに与えられた値は推奨される最小値です。実際には、16ビットシステムが65565以上のサイズのクラスをサポートしていれば非常に驚くでしょう。 –

+0

@James:私はそれを指摘した。良い点は約16ビットで、 'SIZE_MAX'は推奨されている制限より小さくなると思います。 –

0

確かにコンパイラに依存しています。プリプロセス専用モードでコンパイラを実行して、興味がある場合に生成された出力が何であるかを確認することができます。また、マクロではなくテンプレートの展開を見たいかもしれません。 C++ 11では

+0

これは純粋な理論的な質問だったので、私はマクロを使用しています。なぜ私はテンプレートが必要でしょうか?また、コンパイラ固有の場合は、標準の最小限の制限について何らかの言及が必要です。それは私が探していた答えのようなものです。 –

関連する問題