コンパイル中の C クラスのサイズの決定
クラス サイズとメモリ アライメントについて
C では、メモリの割り当てとアクセスを最適化するために、コンパイル中にクラスのサイズが静的に決定されます。クラス サイズを効果的に計算するために、コンパイラはデータ メンバーのサイズやアライメント要件などのさまざまな要素を考慮します。
データ メンバーのアライメントとサイズの計算
プレーン オールド データ (POD) の場合) 決定的なサイズを持つデータ メンバーを持つクラスでは、一般に次のルールが適用されます:
- 各データ メンバーはサイズ (s) とアライメント要件 (a) を持ちます。
- コンパイラーの初期値サイズ (S) は 0 に設定され、アライメント (A) は 1 バイトに設定されます。
-
メンバーは順番に処理されます:
- アライメント要件 (a) を確認してください。 。 S が a で割り切れない場合は、S を増分してメンバーを正しいオフセットに配置します。
- A を現在の A と a の最小公倍数に更新します。
- S を s ずつ増やして、次のようにします。
- すべてのメンバーを処理した後、S が A で割り切れることを確認します。そうでない場合は、それに応じて S を増やします。
- S の最終値はクラス サイズを表します。
追加の考慮事項
- 配列: サイズは、要素の数と要素のサイズを乗算して計算されます。アライメントは、要素のアライメント要件です。
- 構造体: サイズとアライメントは、同じルールを使用して再帰的に計算されます。
- 共用体: サイズは、最大メンバーのサイズに、要素を満たすためのパディングを加えたものです。すべてのメンバーのアライメントの最小公倍数。
例: TestClass3
TestClass3 の場合、サイズの計算は次のように行われます。
- buf[8] はアライメント 1 で 8 バイトを必要とするため、S は 8 になります。
- __m128i vect はアライメント 16 で 16 バイトを必要とします。 S は、アライメントのために最初に 16 に増加し、次に vect に対応するために 32 に増加します。
- buf2[8] にはアライメント 1 の 8 バイトが必要です。S は 24 に増加します。
- 24 は 16 で割り切れないため、S は 8 増加して 32 になります。
したがって、TestClass3 のサイズは 32 バイトです。
結論
これらのアライメントとサイズの計算ルールに従うことで、コンパイラは最適なメモリ割り当てと効率性を確保します。 C クラスのデータ アクセス。
以上がC コンパイラはコンパイル中にクラスのサイズをどのように計算しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。