コンパイラがC(クラス)オブジェクトのサイズを知る必要がある場合:たとえば、スタックにCを割り当てる場合、または別のタイプの直接保持メンバーとして
C ++コーディング標準から:101のルール、ガイドライン、およびベストプラクティス
これは、ヒープに割り当てられたオブジェクトの場合、サイズは必要ないということですか?
Class C;//just forward declaration
C * objc = new C();
コンパイラがC(クラス)オブジェクトのサイズを知る必要がある場合:たとえば、スタックにCを割り当てる場合、または別のタイプの直接保持メンバーとして
C ++コーディング標準から:101のルール、ガイドライン、およびベストプラクティス
これは、ヒープに割り当てられたオブジェクトの場合、サイズは必要ないということですか?
Class C;//just forward declaration
C * objc = new C();
いいえ、このリストは一例であり、除外するものではありません。明らかに、適切な量のメモリを割り当てることができるように、オブジェクトサイズはヒープ割り当てで認識されている必要があります。
あなたの特定の質問に答えるには:
これは、ヒープに割り当てられたオブジェクトサイズが不要であることを意味しますか?
Class C;//just forward declaration C * objc = new C();
C++ではそれができません。
後でサイズを魔法のように解決することで不完全な型に対して''を実行できる場合でもnew
(これはリンカーの協力を得て技術的に可能であると想像できます)、少なくとも2のため、コンパイル時に試行は失敗します。理由:
演算子new
は完全なタイプでのみ使用できます。C ++ 98標準5.3.4から-「[割り当てられた]型は完全なオブジェクト型である必要がありますが、抽象クラス型またはその配列ではありません」
コンパイラーは、どのコンストラクターが存在するか(そしてアクセス可能であるか)を認識していないため、その理由で失敗する必要があります。
オブジェクトのサイズは、new
演算子によって計算されます。
Object *o = new Object();
オブジェクトのサイズを明示的に伝える必要はありませんが、ヒープに正しい量のスペースを割り当てるためにnew
(演算子を使用して) 計算します。sizeof
プログラマーが C++ のオブジェクトのサイズを知る必要はほとんどありません。例えば:
class A {
... // member data
};
void f() {
A a; // allocate on stack
A * p = new A; // allocate on heap
}
どちらの場合も、プログラマーが必要とするサイズの知識は必要ありません。もちろん、コンパイラーはそれを知る必要があります。
どのようにオブジェクトを作成しても、そのサイズは作成時にコンパイラーによって認識されている必要があることに注意してください。
class B; // forward declaration - no size:
void f() {
B b; // compilation error
B * p = new B; // compilation error
}
コンパイラは、2 つの理由でクラスの宣言を確認する必要があります。それは、割り当てる必要があるサイズを知っている必要があります (他の人が既に指摘しているように) だけでなく、コンパイラがオブジェクトの構築方法を知っている必要があるためです:既定のコンストラクターが定義されていますが、既定のコンストラクターはありませんか? コンパイラは、引数なしのコンストラクターでオブジェクトを作成できるかどうかを認識している必要があります。
いいえ。ヒープにオブジェクトを割り当てるには、サイズを知る必要があります。
Foo *foo=(Foo *)malloc(sizeof(*foo));