トップページ > プログラム > 2015年06月21日 > /vdMr5S0

書き込み順位&時間帯一覧

9 位/196 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000002211000000000006



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
C++相談室 part117 [転載禁止]©2ch.net

書き込みレス一覧

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)呼び出しの副作用の無さをコンパイラが見切れば)有り得る


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。