3

私はCの構造体の固定サイズに慣れていました。C++ オブジェクトが修正されているかどうかわかりません。オブジェクトのサイズを予測することは常に可能ですか? コンパイル時に?および/または実行時間?またはsizeof演算子を使用しない限り不可能ですか?ハードウェアプラットフォームに依存していることは知っていました。それ以外に、他に何がありますか?

4

5 に答える 5

4

オブジェクト自体のサイズは を呼び出すことで取得できsizeof、コンパイル時に認識されます。ただし、オブジェクトは他のリソースを管理することができ、そのリソースがどれだけのメモリを消費するかを直接知る方法はありません。

たとえば、gcc 32bitssizeof(std::vector<T>)は 12 (3 ポインター) ですが、数百万のインスタンスを管理しているため、Tそれ自体が大きい可能性があります。

于 2013-10-29T20:28:15.647 に答える
2

どのタイプにもよく知られているサイズ、ポイントがあります。(動的メモリ割り当ては考慮されません)

型の前方宣言のみを使用した宣言は無効です。

class Unknown;
class Failure {
   Unknown x;
};

ポインターを使用すると、宣言が有効になります。

class Unknown;
class Success {
   Unknown *x;
};

実際、C と C++ に違いはありません。どちらも既知のサイズが必要です。

于 2013-10-29T20:50:09.433 に答える
2

C を使用しても、パディングやアラインメントなどに翻弄されます。そうは言っても、メンバー変数のサイズがわかっている場合、C++のstruct/のサイズは一般的に予測可能です。これが少し曖昧になるのは、 と を導入しclass始めたときだけです。その場合、コンパイラは追加の簿記情報を保存する必要があります。とにかく、各オブジェクトのサイズはコンパイル時に認識されるため、演算子はコンパイル時の機能です (これが、テンプレートのメタプログラミングに使用できる理由を説明しています)。virtual functionsvirtual inheritancesizeof

C++ は、「使わないものにはお金を払わない」という原則に従います。類似のデータと関数をクラスにグループ化するだけの場合、オブジェクトはグローバル関数を持つ C の構造体であるかのように動作します。より高度な機能が必要な場合は、使用ごとに料金を支払います。

于 2013-10-29T20:27:37.323 に答える