私はCの構造体の固定サイズに慣れていました。C++ オブジェクトが修正されているかどうかわかりません。オブジェクトのサイズを予測することは常に可能ですか? コンパイル時に?および/または実行時間?またはsizeof演算子を使用しない限り不可能ですか?ハードウェアプラットフォームに依存していることは知っていました。それ以外に、他に何がありますか?
5 に答える
オブジェクト自体のサイズは を呼び出すことで取得できsizeof
、コンパイル時に認識されます。ただし、オブジェクトは他のリソースを管理することができ、そのリソースがどれだけのメモリを消費するかを直接知る方法はありません。
たとえば、gcc 32bitssizeof(std::vector<T>)
は 12 (3 ポインター) ですが、数百万のインスタンスを管理しているため、T
それ自体が大きい可能性があります。
どのタイプにもよく知られているサイズ、ポイントがあります。(動的メモリ割り当ては考慮されません)
型の前方宣言のみを使用した宣言は無効です。
class Unknown;
class Failure {
Unknown x;
};
ポインターを使用すると、宣言が有効になります。
class Unknown;
class Success {
Unknown *x;
};
実際、C と C++ に違いはありません。どちらも既知のサイズが必要です。
C を使用しても、パディングやアラインメントなどに翻弄されます。そうは言っても、メンバー変数のサイズがわかっている場合、C++のstruct
/のサイズは一般的に予測可能です。これが少し曖昧になるのは、 と を導入しclass
始めたときだけです。その場合、コンパイラは追加の簿記情報を保存する必要があります。とにかく、各オブジェクトのサイズはコンパイル時に認識されるため、演算子はコンパイル時の機能です (これが、テンプレートのメタプログラミングに使用できる理由を説明しています)。virtual functions
virtual inheritance
sizeof
C++ は、「使わないものにはお金を払わない」という原則に従います。類似のデータと関数をクラスにグループ化するだけの場合、オブジェクトはグローバル関数を持つ C の構造体であるかのように動作します。より高度な機能が必要な場合は、使用ごとに料金を支払います。