人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

変数に値が保存されるとき、メモリが利用されているのでしょうか。

●質問者: torimaki
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● 犬猫ハーフ
ベストアンサー

プログラミングの話という前提で書かせて貰います。

まず、「変数に値を保存する」処理は、基本的には「メモリに値を書き込む」処理と同様です。

ただし、処理系(コンパイラなど)の最適化の際に、メモリを使わない様に変換する可能性はあります。

例えば、C言語で次の様なループを書いたとします。

int sum = 0;
for( size_t i = 0; i < 100; i++ ) sum += i;

この時、変数i,sumはメモリではなくレジスタ(CPU内部のデータ格納領域)を使用する事も有ります。
これは、コンパイラが「いちいちメモリを読み書きするより、レジスタ上に置いた方が高速だ」と判断した場合です。

まとめると、「基本的にはメモリに書き込む」ただし「最適化でレジスタを使う場合もある」という事です。


torimakiさんのコメント
cdaotgさん ご回答ありがとうございまーす! 基本的には、変数にはメモリが使用される。ただし、処理系のループのさいには、レジスターがつかわれる可能性もある、と。 これは、JavaScriptのようなインタープリタ系の繰り返し処理でも同様でしょうか。たとえば.... for(var i = 1; i <= 10; i++) のような...

椶櫚さんのコメント
インタプリタではたぶん実装してないと思った方がいいかな。 キーワードは最適化です。 最適化というのはコンパイル時のオプションで、 無駄な処理を省くための加工です。 [[wikipedia:コンパイラ最適化]]

TransFreeBSDさんのコメント
インタプリタも、今どきは中間コードへの実行時(JIT)コンパイルをするのが多いので、最適化もあります。 たしかに、変数が実体を持つならレジスタだけで収まる可能性は低いとは思いますが、 ループ展開とか、変数の共通化や定数化などで実体自体がなくなる可能性があります。 しかし、コンパイルも実行時であるとするなら、ループ展開のためのループ変数や、中間コードへ書き込む値という形でメモリ領域を使っているともいえるかもしれませんし、変数が出た段階で名前テーブルとしてメモリを使ってるともいえるかもしれません。 さらに、コンパイラ型ではコンパイル時のこういったことを考慮しないのか、とか、中間コードをキャッシュする場合はどうなんだとか、そんな話もあり得るので、結論としては 「あいまいなものなのでなんとも言えない」 とかいう話になるのでは?

torimakiさんのコメント
コンパイルとインタープリタのちがいが、いまいち良くわかっていないようです、オレ。 まず、そのへんの理解をふかめることが必要かと。みなさま、ご意見、ありがとうございまーす!

2 ● kazuyox

そうです

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ