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

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

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

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

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

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

  • 最初の方の話に戻してしまいますが、昔からローカル変数(auto属性)で文字配列を宣言して初期化すると、スタックに確保されコピーが発生するので、static宣言するというテクニックがあったと思います。

    それにconstが付くと、その後の変更でコンパイルエラーが出るというだけの話ではないでしょうか。

    頭が良くて気の利いたコンパイラなら、最適化時に思いもよらない事はやってくれますが...

  • const int a=2;

    b +=a;

    よりも b +=2;の方が速いと思うしわかりやすいですね、たぶん adda.l er0,#2 とかにコンパイルされるんですよね、もっと早くしようとしたら

    register int a=2; これなんかどれぐらい早いんでしょうか?

  • fujitaさん

    はい、C++です。通りで噛み合わないわけで。。今回のは途中で気づけた内容でした。。
    不定で変数を使うとか、恐れ多いことはしないので、Cのconst仕様忘れてました。

    IKUZOさん

    そこまで期待して書いてますね。メモリ確保されるなんて思ってません (^^;
    最適化だけで言えば、ローカル変数で再代入されていなければ、
    const付いていなくても、コンパイラはconst扱いで定数伝播させるでしょうし。

  • プログラムにおいて定数は分かり易さのためだと思います。

    char Buffer[10];

    main()

    {

      int i;

      for(i=0;i<10;i++){

         Buffer[i]=' ';

      }

    }

    よりも

    #define BufferSize 10

    char Buffer[BufferSize];

    main()

    {

      int i;

      for(i=0;i<BufferSize;i++){

         Buffer[i]=' ';

      }

    }

    の方が、BufferSizeに意味を持たせることができて、検証も修正も安全に行えます。定数の概念はこれになると思います。また、この場合には、

    const int BufferSize = 10;

    にする価値は無いと思います。もともと、定数の定義はコードの分かりやすさのためにあると思います。

    他の言語とは異なりC言語ではポインタを使用するプログラマが多い事やファンクションのみにしたことでconstが必要になってしまったのだと思います。constの目的は定数の定義ではないと思います。

  • そうですよね、BufferSize等は#defineの方が一般的ですよね、constしたい場面等はconst char *st[]={"JP","US"};等の時ですね、ただPCの場合や多くの場合ROM、RAMにこだわっても意味がないですね、実行コード領域がRAMですから、P領域は保護がかけてあるだけです

  • 皆さんC言語だったんですね。C言語なら#defineでいいんでないでしょうか。(他に無いので)
    無理やり理由を挙げれば、#defineはスコープが限定できないですね。名前汚染でぶつかったりしません?

    最初の方に「オブジェクト」とあったので反射的にC++で書いてしまっていました。そのあたりは加味して頂けると助かります (^^;
    C++はconstは言語的に定数でいいと思ってます。CC-RXを使う場合は、クラス内定数が使えないので、整数なら enumハック 使ってます。スコープはとにかく限定したいので。

    >IKUZOさん
    今回の話で文字列にも#define使えば、 コピーのオーバーヘッドなくなる可能性があると思いました。
    C言語なら使っていこうと思ってます。

  • pcook さん#defineは特に規定とか一般的ということについては知らないんですが、原始的Cを使用してきた私にとって

    const int b=3;

    abs=b*2-5;

    cc=x+y+b;

    というような場面ではconstじゃなくて#define使用していますよ(私的)ということでして、

    #define使用するとスコープがということですが適当に逃げてます例えば#define  関数名_変数名_変数型 subb_xp_int とか

    それに#defineが2重定義なら警告も出せるようで、あまり心配していません、enumもおっしゃるように便利なので最近使ってます

  • const を使う所は、配列ではないでしょうか。

    私の実験しているのは、メッセージのような文字列です。

    数値だとしても、配列番号を指定して呼び出す変数じゃないでしょうか。

  • 私もconstの使いどころは変更不可の変数です。専ら関数配列などに使用します。

    immediateな固定値はdefineを用いることが多いですね。