もともと、これは別の質問の一部です。
sizeof
コンパイル時演算子と呼ばれるのはなぜですか?それは実際には実行時演算子ではありませんか?そして、それが実際にコンパイル時の演算子である場合、異なるコンピューターで同じものを実行する移植可能なコードを生成するのにどのように役立ちますか?詳しく説明してください。
sizeof(polymorphic_ptr*)
一定であることは非常に直観に反し、愚かなことだと主張します。ええ、それはC ++の方法ですが、それでも愚かなことです。
もともと、これは別の質問の一部です。
sizeof
コンパイル時演算子と呼ばれるのはなぜですか?それは実際には実行時演算子ではありませんか?そして、それが実際にコンパイル時の演算子である場合、異なるコンピューターで同じものを実行する移植可能なコードを生成するのにどのように役立ちますか?詳しく説明してください。
sizeof(polymorphic_ptr*)
一定であることは非常に直観に反し、愚かなことだと主張します。ええ、それはC ++の方法ですが、それでも愚かなことです。
回答:
sizeof()
メモリ内のその型の特定のインスタンスのサイズではなく、データ型のサイズを提供します。
たとえば、実行時に可変サイズの文字配列を割り当てる文字列データオブジェクトがsizeof()
ある場合、その文字配列のサイズを決定するために使用できません。ポインタのサイズのみを示します。
データ型のサイズは、コンパイル時に常に認識されています。
sizeof
配列で使用する場合、配列のサイズ(要素サイズに要素数を掛けたもの)を取得します。ただし、ポインターで使用すると、ポインターのサイズのみが取得されます。したがって、ほとんどの場合、配列のサイズを知りたいので、ポインタしか持っていないので、あまり便利ではありません。
sizeofがコンパイル時演算子と呼ばれるのはなぜですか?
なぜなら、コンパイラはコンパイル時に式のサイズを計算し、そのコンパイル時の定数値を代入するからです。
それは実際にはランタイム演算子ではありませんか?
いいえ。sizeof
コンパイラが式のタイプを把握できる限り、合法的に実行できない式のサイズを評価することもできます(つまり、未定義の動作が発生します)。
また、C ++ 11より前でもconstexpr
、sizeof
ランタイム式を使用できない方法で式を使用できます。
そして、それが実際にコンパイル時の演算子である場合、移植性のあるコードの生成にどのように役立ちますか...
タイプはプラットフォームによってサイズが異なる場合があります。sizeof
ハードコーディングされた仮定の代わりに式を使用すると、異なるプラットフォームでコンパイルして型のサイズを変更してもコードが破損しません。
C ++は実行時にオブジェクトのメタデータを実際に保存しないため、サイズチェックはコンパイル時に行う必要があります。C ++がサイズを検証しない方法の例については、int
任意のサイズの配列を宣言し、その終わりを超えて読み取ります。運がsegfault
良ければ、C ++が配列のサイズを追跡しないため、単純に意味不明な文章を読む可能性が高くなります。