アプリ版:「スタンプのみでお礼する」機能のリリースについて

for文などでよく一時変数に

for ( int i=0; ・・・
とか
for ( short s=0; ・・・
とか
for ( char i=0; ・・・

みたいに整数型の変数が使われます。

確か変数の表せる範囲は
long>int>short>char
だったと思うのですが、変数を確保する時間やメモリサイズに違いはあるのでしょうか?
たとえばlong型変数を10万個確保する時間とintとかshortとかcharのそれ
とは違いがあるのかなぁと疑問に思いました。

A 回答 (2件)

一時変数の話ですよね?



「i386系の処理系で、一時変数に限定した話」であれば「どんな変数であっても、確保は一瞬で行われる」ので、型やサイズや個数が違っても、何の変わりもありません。

i386系では「一時変数はスタックに作られる」ので「確保動作は、CPUのSPレジスタを必要なだけ減算するのみ」で「全ての変数が一気に確保」されます。

例えば、ある関数をi386系のCPU用にコンパイルすると、アセンブラでは

 push ebp      ;BPレジスタをスタックに退避
 mov ebp,esp    ;現在のSPレジスタをBPレジスタにコピー
 add esp,-0x10244 ;66116バイト分の一時変数を一気に確保
 (ここから関数の中身)
 mov esp,ebp    ;SPレジスタを元に戻し、一気に全部の変数を解放
 pop ebp       ;BPレジスタをスタックから復帰
 ret          ;呼び出し元に帰る

となります。

このように「確保も解放も、1命令」で終ってます。
    • good
    • 0
この回答へのお礼

実践的な回答大変ありがとうございます。
とてもありがたいです。

お礼日時:2009/03/26 06:28

> long>int>short>char


> だったと思うのですが、

違います。
long ≧ int ≧ short ≧ signed char
です。

> 変数を確保する時間やメモリサイズに違いはあるのでしょうか?

処理系や文脈によります。
    • good
    • 0
この回答へのお礼

確かに処理系によって変わるでしょうね・・

お礼日時:2009/03/26 06:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!