- C++相談室 part117 [転載禁止]©2ch.net
638 :デフォルトの名無しさん[sage]:2015/06/21(日) 09:52:07.51 ID:/vdMr5S0 - 組み込み用途だとグローバル変数の割当先をきちんと管理したいからconstは欲しいconst有理
いま単に int g_foo = 1000; // (A) と書いたとしたら、ROMに値1000のための領域が1ワード取られて、さらにRAMにも変数g_foo用に1ワード取られて、 さらにブートストラップコードに値1000をg_fooに書き込む(初期化)処理が発生する。これが const foo = 1000; // (B) なんなら値1000のための領域がROMに取られるだけで済む (尤も、ROMアクセスはRAMアクセスより一般に遅いので、敢えて(A)の書き方にすることもあるがある程度リッチな環境限定 しかしROMに割り当たっているオブジェクトにconstはがしなどやられる可能性を考えると結局はコード見なきゃイカンので、 C++の穴があるconst仕様は糞
|
- C++相談室 part117 [転載禁止]©2ch.net
640 :デフォルトの名無しさん[sage]:2015/06/21(日) 09:56:05.44 ID:/vdMr5S0 - >>637
ようわからんが有り得ない話じゃないんじゃ… argvはポインタの配列なので、同じ配列をpsが参照するのだとしたら、配列内容の書き換えはpsの挙動に影響する
|
- C++相談室 part117 [転載禁止]©2ch.net
641 :デフォルトの名無しさん[sage]:2015/06/21(日) 10:00:41.87 ID:/vdMr5S0 - >>639
const固有の最適化が出来る、 PC相対でデータを参照できるインストラクションセットでなおかつコードをROMに置く場合、constを付けたらPC相対アクセス1命令になる そうでなければ一般に遠くはなれたRAMまでデータを参照に行くコード (最悪、当該変数のアドレスをROMかRAMからレジスタに読み込んで、当該レジスタを使ってリードアクセスの2命令ぐらいになる上に、 レジスタを使う以上値の退避が必要となり、pushやpopまで発生するかも試練、
|
- C++相談室 part117 [転載禁止]©2ch.net
644 :デフォルトの名無しさん[sage]:2015/06/21(日) 10:18:11.32 ID:/vdMr5S0 - >>643
漏れは「配列内容の書き換え」ときちんと断ったで?
|
- C++相談室 part117 [転載禁止]©2ch.net
651 :デフォルトの名無しさん[sage]:2015/06/21(日) 11:58:48.84 ID:/vdMr5S0 - >>650
ようわからんがint c{a}って何でしたっけ…; それはともかく、func(b)にaの実体を書き換える副作用が無い、とコンパイラが判断できる状況なら >>650の例ではfunc()内のcもaも普通に即値に落ちるのでは… (cが事実上const扱いで即値に落ちるのはデータフロー解析の助けを借りてそうなるで最終的にfunc()はtrueを返す関数になる で、同じことはaにconstが付いていなくても言えるんじゃ…
|
- C++相談室 part117 [転載禁止]©2ch.net
652 :デフォルトの名無しさん[sage]:2015/06/21(日) 12:01:25.32 ID:/vdMr5S0 - スマンaは即値に落ちないorz
しかしfunc()が定数trueを返す関数にまで最適化されることは(func(b)呼び出しの副作用の無さをコンパイラが見切れば)有り得る
|