定数が何故スタック領域に配置されるのか

HEWとRX621で、コンパイルしています。

ローカル変数を「const」にすると、スタック領域に配置されます。

関数の最初で、定数をスタック領域にコピーするプログラムが書かれています。

「const static」にすれば、定数のセクションに配置されます。

「const」は定数で書き込めないんだから、スタック領域に書き込むのはおかしいと思うのですが。

Parents
  • 関数内のオブジェクトに static を指定しないと暗黙的に auto ということになるので自動記憶域期間を持ちます。そのブロック内でのみの寿命を持つのでオブジェクトがスタック上に配置されるのは正しいです。

  • RAMじゃなくてROMでいいじゃんってお話ですよね。

    仰る通り、ROMでいいと思いますし、場合によっては、定数領域でもなく即値でいいと思います。

    const有無とstatic有無でどこに配置されるか、

    コンパイラ/リンカのマニュアルに書いてあり、

    コード書く人がコントロールできますよってことだと、私は捉えております。

    といって、何の役にたつのか私にはイマイチ分からなかったりします。

    RAMとROMでアクセスウェイト時間が違ったりする場合に、高速化のために配置制御したくらいです。

    逆に、コンパイラにガンガン最適化して欲しい場合は、どう書けばいいんでしょうか (^^;

  • 私のこれまでの考えではconstは不揮発性ROMに持つものと考えていました、スタック領域ということもあるのですか、初耳です、そうなるとconstで定数扱いした場合に関数コールするたびに値が違いはしないのか?ということですが関数の最初で、定数をスタック領域にコピーしているなら確かにconstと宣言したのと同じ動作はしますね、constとは必ずしもROMに持つとは限らないということですね、なるほどです、動作が正しければいいわけで特別な規則はないわけですね、ただ毎回最初で、定数をスタック領域にコピーしているならCPU時間が無駄ということには気がつかないんでしょうかね、関数の外でグローバルで宣言するのもありますが、見通しが悪くなりますし、いっそのこと#pragmaでも使用して強制的に割り当てるとか、コンパイラの最適化を最高にしてみてはどうですか、プログラムのコードをデータとして扱えないような制約でもあるのですかね、変数宣言するのはやめにして規定値をコード中で指定するようなやりかたにしてみることは可能でしょうかね、毎回最初で、定数をスタック領域にコピーしているのなら、後で書き換えがきくということですかねそうなるとconstにはならないような、const宣言したにもかかわらずstaticになってる

  • 不確かな経験と遠い昔に読んだK&Rのプログラミング言語Cの記憶です。constは型修飾子で、そこで宣言されるのは、定数ではなく値の変化しない変数と認識してます。K&Rのプログラミング言語CではPASCALのような定数定義は無く、defineで大文字で記述するように決めていたような記憶があります。

  •  みなさん、書き込み有難う御座います。

     私の言いたいことは、IKUZOさんの書かれている通りで、スタックにコピーするだけ無駄だなと言う事です。

     コピー元を使えば、メモリーも時間も節約できます。定数と書いたけど、実際の試験では文字列の事です。

    メッセージだと固定データで変更しないですから、「const」を上手に使おうと言う事で実験してみました。

Reply
  •  みなさん、書き込み有難う御座います。

     私の言いたいことは、IKUZOさんの書かれている通りで、スタックにコピーするだけ無駄だなと言う事です。

     コピー元を使えば、メモリーも時間も節約できます。定数と書いたけど、実際の試験では文字列の事です。

    メッセージだと固定データで変更しないですから、「const」を上手に使おうと言う事で実験してみました。

Children
No Data