C++:構造体はすべてが「パブリック」なクラスなので、デフォルトの -ctors が作成されて呼び出されますか?
私が尋ねる理由は、もしあれば、構造体が使用されたときに C++ が C に対して持つ可能性のあるオーバーヘッドを理解することです。C++ では、クラスには構造体にはないオーバーヘッドがあるという意見を聞いたことがありますが、これには疑問があります。
C++:構造体はすべてが「パブリック」なクラスなので、デフォルトの -ctors が作成されて呼び出されますか?
私が尋ねる理由は、もしあれば、構造体が使用されたときに C++ が C に対して持つ可能性のあるオーバーヘッドを理解することです。C++ では、クラスには構造体にはないオーバーヘッドがあるという意見を聞いたことがありますが、これには疑問があります。
C++ では、構造体メンバーのデフォルトの可視性がパブリックであるのに対し、クラス メンバーはデフォルトでプライベートであることを除いて違いはありません。
パフォーマンスに関しては、構造体の構築はクラスの構築と同じくらい高速です。もちろん、実際の速度は、構造体に含まれるものによって異なります。C 構造体を C++ に移動する場合、構造体には POD 型 (単純な古いデータ - クラスなし) のみが含まれ、コンストラクターはありません。
構造体には、クラスとまったく同じ状況で、デフォルトのコンストラクターがあります。
ちなみに、構造体は「すべて公開されたクラス」ではありません。public をデフォルトのアクセス指定子とするクラスです。構造体にはプライベート メンバーを含めることができますが、そうするとコード レビュー担当者に殴られる可能性があります。
関連する問題は、構造体とクラスではなく、POD と非 POD です。
クラスの "int" メンバーは、初期化子リストで値を指定するか、コンストラクターで値を設定しない限り、初期化されないことを覚えていますか? まあ、同じことがすべての POD タイプに当てはまります。POD 構造体 (または POD クラス) のデフォルトのコンストラクターは、何の関係もありません。したがって、名目上は存在しますが、コンパイラは実際に生成して呼び出すべきではありません。
これは、C で定義できた任意の型の既定のコンストラクターを C++ で使用した場合、実行時のオーバーヘッドが発生しないことを意味します。実際には、すべての C++ コンパイラが十分な最適化を適用して、すべてのコードが常に C としてコンパイルされた場合と同じくらい良いバイナリを出力するようにしているわけではないという噂を耳にします。問題 - 通常は同じだと思います。
したがって、POD 構造体が与えられた場合:
struct sPOD {
int foo;
float bar;
char baz[23];
};
以下は、C と同様に、C++ でコードを出力しない可能性があります (コンパイラが自動変数をどれだけ一緒にロールするかに応じて、スタック ポインターを移動する可能性があることを除いて):
sPOD s1;
実際、gccではそうではありません。
良い質問!Stroustrup の私の読書は、Roddy の答えに同意する傾向があります。ただ、ctorが呼び出されるかどうかは、構造体の作り方にある程度依存すると思います。たとえば、mallocを介して構造体を作成した場合、コンストラクターが呼び出されるとは思いませんが、新しいものを作成した場合は呼び出されると思います。
とは言っても、私は実際に上記をチェックしていません。
Stroustrup の著書The C++ Programming Language, Special Editionの 234 ページのセクション 10.2.8 で、彼はコンストラクターを持つ構造体の例を示しています。彼はまた、テキストの少し下の方で、「コンストラクターとアクセス関数は、そのような構造に対しても非常に役立つ可能性があります . . .」と述べています。彼が「構造」という言葉を厳密な技術的な意味で使っているとは思えませんが。したがって、構造体にはデフォルトのコンストラクターがあると思います。