sizeofがコンパイル時演算子と呼ばれるのはなぜですか?


12

もともと、これは別の質問の一部です。

sizeofコンパイル時演算子と呼ばれるのはなぜですか?それは実際には実行時演算子ではありませんか?そして、それが実際にコンパイル時の演算子である場合、異なるコンピューターで同じものを実行する移植可能なコードを生成するのにどのように役立ちますか?詳しく説明してください。



3
実行時に型のサイズがどのように変化すると予想しますか?

@MichaelT:型のインスタンスのサイズは確かに変化する可能性があります。結局のところ、クラスポリモーフィズムがあります。私は、sizeof(polymorphic_ptr*)一定であることは非常に直観に反し、愚かなことだと主張します。ええ、それはC ++の方法ですが、それでも愚かなことです。
モニカ

@KubaOber確かに。私は、OPが異なるケースでどのように振る舞うべきであるかを知りたいと思っています。

4
「コンパイル時に動作するため」という答えを支持するために来ましたが、がっかりしました。
ベンジャクソン

回答:


23

sizeof()メモリ内のその型の特定のインスタンスのサイズではなく、データ型のサイズを提供します。

たとえば、実行時に可変サイズの文字配列を割り当てる文字列データオブジェクトがsizeof()ある場合、その文字配列のサイズを決定するために使用できません。ポインタのサイズのみを示します。

データ型のサイズは、コンパイル時に常に認識されています。


3
C(++)には実行時オブジェクトのメタデータがないため、実行時にこれらのものを実際に取得することもできません。
C.ロス

5
実際、sizeof配列で使用する場合、配列のサイズ(要素サイズに要素数を掛けたもの)取得します。ただし、ポインターで使用すると、ポインターのサイズのみが取得されます。したがって、ほとんどの場合、配列のサイズを知りたいので、ポインタしか持っていないので、あまり便利ではありません。
sepp2k

1
@Jens質問には[C ++]というタグが付けられており、VLAはC ++標準に準拠していません。
authchir

13

「呼び出し」全体のサイズはコンパイル時に計算され、括弧で囲まれたものはすべて破棄され、実行時に実行されないため、

結果は純粋にコンパイラーが利用できる静的型情報に基づいています


7

sizeofがコンパイル時演算子と呼ばれるのはなぜですか?

なぜなら、コンパイラはコンパイル時に式のサイズを計算し、そのコンパイル時の定数値を代入するからです。

それは実際にはランタイム演算子ではありませんか?

いいえ。sizeofコンパイラが式のタイプを把握できる限り、合法的に実行できない式のサイズを評価することもできます(つまり、未定義の動作が発生します)。

また、C ++ 11より前でもconstexprsizeofランタイム式を使用できない方法で式を使用できます。

そして、それが実際にコンパイル時の演算子である場合、移植性のあるコードの生成にどのように役立ちますか...

タイプはプラットフォームによってサイズが異なる場合があります。sizeofハードコーディングされた仮定の代わりに式を使用すると、異なるプラットフォームでコンパイルして型のサイズを変更してもコードが破損しません。


1
まあ、私はこれが最も有用な答えだと思う;)。ブロ(あなたが男性であると仮定して)、私は疑問を持っています。sizeofはプログラムを移植可能にするという人が言うとき、ソースコードはすべてのマシンでエラーなしでコンパイルできることを意味し、実行可能プログラムをどのマシンでも実行できるという意味ではありません。正しい ?これが正しい場合、私の疑問は本当にクリアされます。
平和的なコーダー

1
ええ、コードは移植性があり、プラットフォームごとに(異なる)正しいバイナリをコンパイルできるという意味です。
役に立たない

5

C ++は実行時にオブジェクトのメタデータを実際に保存しないため、サイズチェックはコンパイル時に行う必要があります。C ++がサイズを検証しない方法の例については、int任意のサイズの配列を宣言し、その終わりを超えて読み取ります。運がsegfault良ければ、C ++が配列のサイズを追跡しないため、単純に意味不明な文章を読む可能性が高くなります。

参照配列(UNIX)の終わりを過ぎて読んでから缶C / C ++プログラムワンセグ障害?SOの例です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.