C ++のリファレンスを読んでいたところ、constとして定義されたオブジェクトのROM性を確保するために、次のことがわかりました。1
.クラスまたは構造体にユーザー定義のコンストラクター
を含めることはできません。ユーザー定義のコンストラクターまたはデストラクター。
これは、可変定数ではなくビット単位の定数を参照しています。
私の見解では、コンストラクタまたはデストラクタがconstデータメンバーを変更するため、最初のものが当てはまります。したがって、ユーザー定義のコンストラクタまたはデストラクタの使用は控えます。
しかし、私は2番目の点について良い説明を得ることができません。
3 に答える
あなたが言うように、ユーザー定義のコンストラクターを持つオブジェクトは実行時に初期化されるため(main
静的な有効期間がある場合は、実行前の動的初期化フェーズ中に)、読み取り専用に配置できないため、最初のポイントが必要です。その初期化はオブジェクトのメモリを変更する必要があるため、メモリ。
2番目のポイントは最初のポイントに続きます-(非静的)メンバーまたはベースサブオブジェクトにユーザー定義のコンストラクターがある場合、そのコンストラクターを使用して、実行時にメンバーまたはサブオブジェクトを初期化する必要があります。したがって、オブジェクトの少なくとも一部を読み取り専用メモリに格納することはできません。そのため、オブジェクト自体を作成することはできません。
コンストラクター/destructsはオブジェクトを変更しますが、これはROMに格納されているオブジェクトに反します。
クラスにオブジェクトが含まれている場合、またはコンストラクターを継承している場合でも、オブジェクトを作成するために実行する必要のあるコードです(メンバーは親オブジェクトと一緒に格納されます)。これは、コンパイル時(ROMオブジェクトがアセンブルされているとき)には実行できません。
POD
これは、C++03で の定義のように見えます。POD
プレーンな古いデータを意味します。そのconst
グローバルインスタンスは、ROM
コンパイラとプラットフォームによって配置される可能性があります。
C ++ 11は、ableにマッピングできる新しい言語機能を追加しますROM
。 constexpr
コンストラクターとそれらの間の標準レイアウトタイプは、一部のコンパイラーが何に入れることができるかについての合理的な一連の制限である可能性がありますROM
。ただし、これはコンパイラのデータのサポートに依存しROM
ます。