No.3ベストアンサー
- 回答日時:
> 私のつたない認識では、const宣言された変数はROMにマッピングされるものと思っております。
const修飾されたオブジェクトがROMに配置されるのは、非volatileの場合だけです。volatile修飾された場合は、const修飾子が付いていても初期化子も省略できます。これは組み込みであろうがなかろうが同じことです(コンパイラの不具合や非標準処理系の場合は知りません)。
> どんな要因でもaaaが変更されることはなく、つまりvolatileをつける意味がないように思えるのです。
先に書いたように、volatileが付いていれば原則としてRAMに配置されませんし、制御レジスタやI/Oポートの場合はリンカやアセンブラで指定したり、(*(const volatile unsigned char*)0x123456)のように定義したマクロなどを使うでしょうから、十分意味あることです。
仮にaaaがROMに配置された場合でも、バンク切り替えやフラッシュメモリの書き換えで値が変化する可能性はいくらでも考えられますね。
>const修飾されたオブジェクトがROMに配置されるのは、非volatileの場合だけです
知りませんでした。
大変勉強になりました。ありがとうございます
No.5
- 回答日時:
>"volatile aaa"でいいような気がして
ん?論点が摩り替わってしまっていますよ。命題は「volatileが必要か否か」ですよね?が、返信内容は「const intが必要か否か」になってしまっています。これではどちらを知りたいのか分かりません。
私が言いたい結論は、
「命題のvolatileコードを書いた人の意図は、"変数aaaに最適化操作を施さない絶対の安全性を保証したかった"のでは?」
という事です。
>constで宣言された変数はROM上にマッピングされる
いいえ、volatile無しの変数なら必ず割り当てられる保証はありません。
前回お話した通りコンパイル時、前段処理が「const変数が何処にも使われた形跡が無い」と判断したら、後段処理(オプティマイザ)が「じゃあ削除しちゃえ!」とするような環境もあるからです。無い物をROMに割り当てる事はありませんから。
コンパイラの目には使われた形跡が無くとも、実は使っている場合もある訳です。間接的な参照の仕方をするコーディングも行えるからです(既述)。こういう時は、最適化段で勝手な真似をして欲しくない訳です。
No.2
- 回答日時:
>どういった場合があるのでしょうか?
オプティマイザによる削除を避ける為ではないでしょうか。
一見 aaaを参照するコードが見当たらないようなソースがあったとします。
それをコンパイルすると、オプティマイザによってはaaaを削除される場合があります。が、valatile指定によりそれを避けようという意図ではないでしょうか。
一見、aaaを使わないように見えても、実際には即値アドレッシングによるポートアクセス等で、aaaを使う場合があります。が、コンパイラはそれを見抜く事ができない訳です。
こういう希な状況下においてvolatileを使ったのではないか、と推測しました。
回答ありがとうございます。
私のうすい知識では、おっしゃているような状況では、"volatile aaa"でいいような気がしてしまいます。
組み込みでは、constで宣言された変数はROM上にマッピングされるため、値がどういう状況下でも変わらないと思っています。
間違ってますでしょうか?
No.1
- 回答日時:
早い話が入力ポートのようなものがconst volatile修飾されます。
他には受信バッファなどもそうかと思います。要するに、Cの文脈で値を変更することはできないけれども、別の要因で、読み込むたびに値が変化する可能性があるようなオブジェクトに対して指定します。
早速の回答ありがとうございます。
私のつたない認識では、const宣言された変数はROMにマッピングされるものと思っております。
どんな要因でもaaaが変更されることはなく、つまりvolatileをつける意味がないように思えるのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- JavaScript WordPressのコンタクトフォーム7にて送信者の位置情報を送らせたい 2 2022/09/14 23:28
- JavaScript 条件に該当した時のみ定数を宣言する事はできますか 8 2023/03/15 05:55
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++ で、「)」が必要 というエ...
-
コンパイルできない
-
C言語
-
変数(関数)名の頭に_
-
コンパイラについて
-
ABAQUS ユーザーサブルーチン...
-
io.hをincludeしたプログラムで...
-
io.hをincludeするとそのような...
-
sprintfを用いたフォーマット文...
-
C言語のオススメ統合開発環境(...
-
PL/SQLで、区切りのスペースは...
-
C言語のワーニングメッセージの...
-
秀丸エディタでのC言語環境(ハ...
-
Eclipseの環境設定について
-
ブラウザ上でクライアント側で...
-
fortranでのNaNについて
-
コンパイラフラグ(compiler fla...
-
FORTRANとC++の連動について
-
Vba 実数および実数タイプの変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++ で、「)」が必要 というエ...
-
コンパイルできない
-
C++でアボート(Abort)で処理が...
-
変数(関数)名の頭に_
-
Visual C++とVisual C++.NETの違い
-
Eclipseの環境設定について
-
volatile修飾について
-
コンパイラについて
-
linuxのセキュリティ対策と致し...
-
__extension__
-
io.hをincludeするとそのような...
-
コンパイラフラグ(compiler fla...
-
PICマイコンによる乱数の表示に...
-
conio.h? curses.h?
-
【エラー】Cpadで初めてコンパイル
-
ABAQUS ユーザーサブルーチン...
-
関数の戻り値による変数の初期化
-
Delphiの逆コンパイル
-
プリコンパイラとは?
おすすめ情報