次のように行っているとき:定数はどのくらいのメモリをCで取るのですか?
const int a = 5;
ちょうど変数のようにメモリの4バイトを取得する場合、私は疑問に思いますか? (32ビットシステムで)
次のように行っているとき:定数はどのくらいのメモリをCで取るのですか?
const int a = 5;
ちょうど変数のようにメモリの4バイトを取得する場合、私は疑問に思いますか? (32ビットシステムで)
コンパイラによって異なります。例えば
:
const int a = 4;
これはコンパイラ4つのバイトを割り当てるだけ不変性を強化することによって処理することができました。
あなたは定数文字列があった場合:
static final java.lang.String name = "Foobar";
コンパイラは変数を削除し、変数が使用されているすべての場所で実際の文字列「FOOBAR」でそれを置き換えることができます。これはヒープからスペースを取りませんが、それでもプログラムのデータセグメントのどこかに格納する必要があります。 Javaは、複数の場所で使用されている引用符付きの文字列を検出すると、これを実行しようとします。そのため、1つのコピーのみを格納する必要があります。
どちらの方法でも、定数によってストレージの割り当てが行われるわけではありません。せいぜい、必要なストレージを最小限に抑えるだけです。
私はまたそれがコンパイラに依存すると思う – root
それはあなたのアーキテクチャに依存しますが、何かをconstで作るかどうかは、実際にはサイズに影響を与えず、メモリ内での位置に大きく影響します。さて、あなたが実際に起こると思うものを変更するコンパイラの最適化がいくつかありますが、これが基本的な考え方です。
はい、そうです。 アドレスを取らない場合、オプティマイザは完全に削除して、定数の参照をケースの5番に置き換えます。
Cの定数オブジェクトには、デフォルトで外部リンケージがあります。これは、オプティマイザがそれらを削除するのはちょっと難しいため、オブジェクトファイルからエクスポートする必要があります。より高度なグローバルオプティマイザだけがこれを行うことができるので、削除されていなければ驚かないでください。 C言語では、 "リムーバブル"定数を明示的に宣言する必要があります。 – AnT
これは、コンパイラが定数へのすべての参照をリテラル「5」で置き換える可能性が高いことを意味しますが、元の定数オブジェクトをメモリから直接削除することはできません(実際にはプログラム内のどこにも決して参照されません)。 – AnT
スタックから削除してヒープすると、コンパイル時に別の定数と混合されていない場合は、アセンブリコード内に存在します(1回または複数回)。 –
普通の量がかかるかもしれませんが、アドレスを必要としない方法でのみ使用すると、コンパイラ/リンカーはメモリを一切占有しないように最適化することがあります。
一般に、定数は変数と同じスペースを使用します。したがって、intがアーキテクチャ上で32ビットの場合、32ビットも使用されます。 しかし、コンパイラは定数をコードに直接入れることもできます。これは、定数が実際にどこに定義されているかによって決まります。つまり、コンパイラがaを変更する(たとえばconstキャスト)か、aのアドレスを取る機会がないと判断できるかどうかによって異なります。
によって異なります。
const int a = 5;
メモリの4バイト(または、intがシステムで使用する多くのバイト数)を消費します。
あなたはそれを静的にする場合:
static const int a = 5;
オプティマイザは5の値でa
の各インスタンスを置き換えるために自由です。リードオンリーメモリは書き込み可能なメモリから分離されている組み込みシステム上
extern const int a;
:あなたが別コンパイル単位でa
を参照することができるというだけの理由オプティマイザは、最初の(非静的)場合にそれを行うことができませんこの定数はRAMを使用せず、ROMにのみ格納されます。同様に、仮想メモリを持つシステムでは、定数は読み込み専用メモリページにロードされ、実行中のプログラムのコピー数に関係なく、RAMを1回だけ使用します。
メモリ消費量には、int a
とconst int a
の間に違いはありません。
const
と宣言されたCオブジェクトでは、(C++ではなく)定数式が作成されず、デフォルトで(C++ではなく)外部リンケージがあります。これはC言語では定数オブジェクトが非定数オブジェクトとほぼ同じもので、変更不可能であることを意味しています。
また、Cでは、定数オブジェクトは他の答えがそうすると主張するように、「削除」する可能性はほとんどありません。あなたが本当にC言語で "リムーバブル"にしたいのであれば、それを明示的にstatic
と宣言しなければなりません。しかし、それでもconst int
オブジェクトを定数式にすることはできません。つまり、C89/90で配列サイズを指定するのにそれを使用することはできず、結果として得られる配列は可変長配列(VLA)です。
定数変数は、メモリの4つのバイトを必要とするが、それが値である場合のアセンブリコードがこの
のMOV EAXのような値をembbedので、それは0バイトを必要とし、5
ここで5ドント変数から来ますが、定数5です。値を取得するためにメモリ呼び出しが不要なため、より高速なコードを生成します。アセンブリコードの一部です。
グローバルであり変更されない場合は、オプティマイザに手助けをして 'static const int a = 5;とする' –
"' const'は間違った意味を持つキーワードです。日常的な意味で「const」は作成されません。書き込めない普通の古い通常のオブジェクトが作成されます。コンセプトのキーワードが "readonly"で言語に導入されていれば、もっと幸せになれます。私はそれを変更するのが良いとは思いません** ** _ – pmg
Odd。私は長い間C/C++を使っていませんでしたが、 'const int'はC++の追加であり、' #define'が必要でした。 –