Cコンパイラとコンパイラフラグのバージョンに依存して、関数内の任意の場所で変数を初期化することができます(私の知る限り)。Cの関数と変数のメモリ割り当て
私はすべての変数を関数の先頭に置いていましたが、関数内の他の場所に変数が定義されていれば、変数のメモリ使用についての議論が始まりました。
以下に私は2つの短い例を書いています。誰かが私にそのメモリがどのように割り当てられているか説明することができるかどうか疑問に思いました。
例1:変数yは可能なreturn文の後に定義されていますが、この変数がその理由で使用されない可能性があります。これは問題ではないと認識しています。 )は、変数が関数の先頭に置かれていれば同じになります。これは正しいです?
例2:変数xはループ内で初期化されます。つまり、この変数のスコープはこのループ内にのみありますが、この変数のメモリ使用はどうですか?関数の上に置かれていれば、それは違うでしょうか?または、関数呼び出し時にスタック上で初期化されましたか? 変数の範囲を縮小したり、最初の使用の場所を変更したりすることは、メモリの使用に影響しますか?
コード例1
static void Function(void){
uint8_t x = 0;
//code changing x
if(x == 2)
{
return;
}
uint8_t y = 0;
//more code changing y
}
のコード例では、2
static void LoopFunction(void){
uint8_t i = 0;
for(i =0; i < 100; i ++)
{
uint8_t x = i;
// do some calculations
uartTxLine("%d", x);
}
//more code
}
さて、これは、明確ではないかもしれないところ、それが外にあるとき、上部にあるすべての変数を置くのではなく、それをこのようにコーディングし、実際に、より効率的であることを意味しますスコープ、またはいつ使用する予定ですか?それともこれは問題ではないのですか? – koldewb
@koldewb変数のアクティブな使用領域を把握し、それに応じてメモリを割り当てることができるので、コンパイラには関係ありません。しかし、あなたのコードを読んでいる人にとっては大変重要な意味を持つので、変数を使用する場所に近づけて配置することは、すべてを上にするよりも優れています。 – dasblinkenlight