Cでは、割り当てられたメモリに関してastatic const int
とaの違いは何ですか?const int
void f(int *a)
{
static const int b = 10;
const int c = 20;
*a = b + c;
}
b
消費するだけsizeof(int)
ですか?そして、それは値のためc
に消費しますか、そして、実行中にコピー命令を加えますか?sizeof(int)
20
sizeof(int)
f
Cでは、割り当てられたメモリに関してastatic const int
とaの違いは何ですか?const int
void f(int *a)
{
static const int b = 10;
const int c = 20;
*a = b + c;
}
b
消費するだけsizeof(int)
ですか?そして、それは値のためc
に消費しますか、そして、実行中にコピー命令を加えますか?sizeof(int)
20
sizeof(int)
f
言語標準はこれについて何も述べていません。
ただし、コンパイラがコードを次のように変換する可能性があります。
void f(int *a) {
*a = 30;
}
したがって、メモリをまったく割り当てません(明らかに命令スペースを除く)。
static const intは、プログラム実行の存続期間中に1回割り当てられます。
関数内のconstintは、関数に入るたびにスタックに割り当てられ、終了時にスタックから割り当て解除されます。
上記の「ただし、コンパイラがコードを次のように変換する可能性があります:」は正しくありません。「静的」ストレージクラスを要求した場合、コンパイラはそれを無視しません。静的変数は、他の理由の中でも特に、ポインタを渡すためにメモリ内にあると見なすことができます。
両方の定数が関数内で既知であるとすると、コンパイラーがそれを作成しないようにするにはどうすればよい*a = 30;
ですか?この例では、ストレージb
も必要ありません。c
ストレージが必要な場合:
static const int b = 10;
1つのsizeof(int)を使用します[おそらく、パディングのためにより多くのスペースが使用され、データセクションの前後に何が来るかによって異なります。a
また、特定のシナリオでコンパイラが提供するパディングの量を示すものはありません。必要なものは何でもです。コンパイラが対象としているシステムで物事を「機能」させるため]。システムのアーキテクチャによっては、b=10を設定するために必要なコードが存在する場合があります[そのサイズについては以下を参照してください]。
const int c = 20;
スタック上でsizeof(int)バイトを使用する可能性がありますが、b
20に初期化するコードもあります。これは、2、3、5、6、7、8、16などに応じて任意の小さな数になります。プロセッサアーキテクチャと、その作業を実行するために必要なインストルメンテーションのタイプ。もちろん、コンパイラーは必要な場所で直接20を使用できます。
しかし、コンパイラーが必要とするのは、*aが何らかの方法で30に設定されていることだけです。それ以外はすべて「コンパイラー次第」です。
あなたの例では、それらは同じ意味であり、@ Oliで述べられているように、コンパイラは実際のコードが最終的なコードに含まれないように最適化します。
しかし、ここに別のユースケースがあります:-
int func1(int v) {
const int c_i = compute_some_things(v);/* calculate the c_i everytime we enter this function */
return c_i = v + c_i;
}
int func2(int e) {
static const int c_i = compute_some_things_one_time();/* c_i is calculated ONCE, the next time, the value of c_i is retained every time the function is entered */
return c_i = e + c_i;
}