• ベストアンサー

関数内でconst修飾子を使用した場合の配置

お世話になります 関数内でconst修飾子を付加した領域を宣言します。 その領域は何処に取られるのでしょうか? RAM?ROM?スタック? コンパイル環境により異なるのでしょうか? void Test(void) { const int i_dat = 0;   ・・・・・・ } よろしくおねがいいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

念のため... C++ではconst修飾されたオブジェクトは、実行時に実体が生成されないことが多々あります。関数の中で定義されても、外で定義されてもです。Cでも、最適化しだいではありえます。 この場合、どこにも領域が取られません。

その他の回答 (2)

  • TT414
  • ベストアンサー率18% (72/384)
回答No.2

>コンパイル環境により異なるのでしょうか? どころか、コンパイル時の最適化オプションの指定、関数の複雑さの程度により、RAM、ROM、register、又はプログラムコードなどのどれかになります。 register、又はプログラムコードはi_datのアドレスを使用していないときに最近のコンパイラでは、なるはずです。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

> コンパイル環境により異なるのでしょうか? はい。 CとC++でも事情が異なります。また、型によっても事情が異なります。

関連するQ&A

  • const int i ? int const i ?

    お世話になります 初歩的な事ですがよろしくお願い致します const 修飾子って変数型の前につけるの?後につけるの? //---------------------------------------------------- const int iTest1[] = { 0x0000, 0x0000 }; const int iTest2[] = { 0xFFFF, 0xFFFF }; const int* const piTest[] = { iTest1, iTest2 }; //---------------------------------------------------- const int 型のポインタ配列をロム領域に確保したい場合は変数の後にconst修飾子をつけると思います const const int* piTest[] = { iTest1, iTest2 }; これだとエラーとなるはずです。。。 そこで、疑問に思ったのが、私の書式だと、const intとconst修飾子は前に着けるのが普通だと思ってました //----------------------------------------------------   const int i = 0;   int const i = 0; //---------------------------------------------------- でも、どちらでもコンパイルは通ると思います 配置領域を確認した所、どちらもROMに確保されてました 一般的にどちらが正解なのでしょうか? const const int* piTest[] = { iTest1, iTest2 }; が、エラーになるという事は、int const i が正解なのでしょうか? 教授よろしくお願い致します ちなみに、組み込み系に特化した話になっています windows系とかだとconst宣言は何処にいくんですかね・・・ ヒープじゃない予備領域とかあるんですかね・・・

  • メンバ関数にconstをつけた際の問題

    C++を勉強中の学生です。 以下のようなコードで問題が起こりました。 class TEST{ private: int mArray[10]; //(int a;) public: int* get_mArray(void) const; //(int get_a(void) const;) }; int* TEST::get_mArray(void) const{ return mArray;    //配列の先頭要素の値を受け取りたい。 } //(関係のありそうな部分のみを抜き出しました) このコードにおいて、関数は値を変えない事が明白なので、constをつける必要性はないのですが(癖でつけた際に発生した問題です)、 なぜconstをつけると動作しなくなるのか知りたいです。 //()で囲った部分を有効にし、 int TEST::get_a(void) const{return a;}という関数はエラーにならなかったのですが、どのような違いがあるのでしょうか? 出たエラーは(visual C++ 2010) 'const int [10]' から 'int *' に変換できません。 というものでした。 ポインタとconst関連の部分を手持ちの本で勉強しなおしたのですが、解答を得られなかったのでこちらで質問させてもらいます。

  • 配列とポインタの使い方

    ROM領域にあるたくさんのデータの一部をRAMにコピーしたいのですが、うまくいきません。 どこがおかしいのか教えていただけないでしょうか? (例:int型の10個のデータとchar型の5個のデータをRAMへコピーする) // ROM領域に置いたテーブル const int int_table1[10]={1,2,3,4,5,6,7,8,9,0}; const char chr_table1[5]={1,2,3,4,5}; const int int_table2[10]={11,22,33,44,55,66,77,88,99,100}; const char chr_table2[5]={11,22,33,44,55}; // RAM領域 int int_data[10]; char chr_data[5]; // プロトタイプ宣言 void copy_data(int *int_p,char *chr_p); //メイン処理 | copy_data(int_table1,chr_table1); // テーブル1をRAMへコピー | | copy_data(int_table2,chr_table2); // テーブル2をRAMへコピー | // ROMデータをRAMに転送する関数 void copy_data(*int_p,*chr_p) { char i; for (i=0;i<10;i++) { int_data[i]=int_p; int_p++; } for (i=0;i<5;i++) { chr_data[i]=chr_p; chr_p++; } } コンパイルすると [Warning(ccom)] assignment from const pointer to non-const pointer ===> copy_data(int_table1,chr_table1); // テーブル1をRAMへコピー [Error(ccom)] mismatch prototyped parameter type ===> copy_data(int_table1,chr_table1); // テーブル1をRAMへコピー のワーニング&エラーになります。 どのようにしたらワーニング、エラーを直せますか? または「こうすればできる」という回答でもOKです。 よろしくお願いします。

  • constの位置

    申し訳ありませんが、続けて質問させていただきます。 char const と const char は同じ意味でしょうか。 次のプログラムは配列をconst charと宣言しています。 ary[1]='N'; の行で、意図した通りにコンパイルエラーになります。 これはchar constと宣言しても、同じ意味なんでしょうか。 #include <stdio.h> int main(void) { const char ary[ ] = { 'A', 'B', 'C', '\0' }; ary[1] = 'N'; printf("aryは%s\n", ary ); return 0; } また、 const int a=1; int const a=1; この2つは同じ意味でしょうか。

  • bsearch関数の呼び出しで

    C言語の深いところまで理解しようとしてます。今まで使わないだろうと思っていた関数へのポインタ なのですが、 2分探索のところで bsearch関数というのが出てきました。 この関数は第5引数に比較関数を引数にするのですが p = bsearch(&ky, x, nx, sizeof(int), (int (*)(const void *,const void *))int_cmp ); という形でサンプルソースには載っています。 この (int (*)(const void *,const void *))int_cmp の部分なのですが、まず戻り値をキャストするなら int (*)ではなく(int *)ではないでしょうか。 それとint_cmpは比較関数なのですが、引数が左側に来る、というところが納得できません。 ちなみにソースファイルをcppのままだとコンパイルできませんでした.cに拡張子を直したらコンパイルできました。 説明が足りないところがあったら指摘してください。お願いします。

  • volatile修飾について

    組み込み系等でよく用いられる、volatile修飾子について質問させてください。 たまに、"volatile const int aaa" などと宣言された変数を見かけることがあります。 volatileやconstの意味はわかっているつもりですが、"const int aaa"ではなく、"volatile const int aaa"と宣言しなくてならないケースというのは、どういった場合があるのでしょうか? 具体的なコードで例を示していただけると助かります。 以上、よろしくお願いします。

  • constのついたメンバ関数

     こんにちは。 C++を勉強しているのですが疑問に思ったことがあります。 const指定したメンバ関数にメンバ変数の変更をすることはエラーになるはずなんですが、 下記にある(*m_pRefCnt)++; はコンパイルが通るようです。 なぜこの一文だけ通るのでしょうか? 以下にソースを添付しておきます。 #include <iostream> class hogeClass { private: int* m_pRefCnt; int val; void AddRef() const { (*m_pRefCnt)++; // これはOK? val = 100; // これは駄目 } void Release() { } public: explicit hogeClass(char* src = NULL) : val(0) { } int& GetRefCnt() { return *(m_pRefCnt); } virtual ~hogeClass() { Release(); } }; int main() { int c = 435, k = 222; using namespace std; hogeClass a; getchar(); return 0; } 分かる人がいたらよろしくお願いします。

  • こんなコンパイルエラーがでます。

    OS:WinNT4.0 環境:VC++6.0 MFC コンパイル時に次のエラーが出て来ました。 error C2664: 'qsort' : 4 番目の引数を 'int (const void *,const void *)' から 'int (__cdecl *)(const void *,const void *)' に変換できません。 (新しい機能 ; ヘルプを参照)スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。 qsort関数の引数関数を'int xxxxxxx(const void *,const void *)に宣言したところこのエラーが出てきました。 何がなんだかさっぱりわかりません。 ぜひお願いします。

  • qsortの関数ポイントについて

    qsortの関数ポイントについて int int_cmp(const int *a, const int *b) { ------ } main { qsort(x,nx,sizeof(int),(int (*) (const void *, const void * )) int_cmp); 上記の(1)関数のポイント,(int (*) (const void *, const void * )) int_cmpを  普通の(2)関数ポイント(* int_cmp) (const void *, const void * )で呼べない  理由 、また、(1)(2)は、同じ意味でしょうか、教えて頂きたい。

  • const の使い方

    お世話になります。 VC5.0からVC2005.NETにソフトの移植をしているのですが、 その際、const の使い方で混乱しております。 環境:WinXP、VC2005.NET 以下のコードをビルドするとコンパイルエラーが出てしまいます。 ネットで検索しても、混乱中の上自分のケースに当てはまっているのか どうかさえも怪しい状態でして・・・ --コード-- #include "stdafx.h" class A { public: void func( const int*& a ); }; void A::func( const int*& a ) { return; } int _tmain(int argc, _TCHAR* argv[]) { int *a; A CA; CA.func( a ); ←※ここでエラー return 0; } --ここまで-- --エラー-- error C2664: 'A::func' : 1 番目の引数を 'int *' から 'const int *&' に変換できません。(新しい機能 ; ヘルプを参照) --ここまで-- 基本的なことですがご教授願います。

専門家に質問してみよう