- ベストアンサー
変数 と 配列
int[] kazu1 = new int[3]; int[] kazu2 = new int[3]; int[] kazu3 = new int[3]; int[] kazu4 = new int[3]; int[] kazu5 = new int[3]; int[] kazu6 = new int[3]; int[] kazu7 = new int[3]; の配列と int kazu1, kazu2, kazu3 ~ kazu19, kazu20, kazu21; と変数宣言とでは どちらがどちらが メモリ消費 を抑えれますか? 確保スピードが速いですか? 教えてください
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
raiden0816さんに一票・・かな? int[] kazu1 = new int[3]; の方式では、int[]の領域が7つ分、int[3]の領域が7つ分。 int kazu1, kazu2, ・・・ の方式では、intの領域が21個分。 配列オブジェクトに要素数の記憶領域がないとしても(たぶん実装依存だけど普通はあるのでは?)、後者のほうがメモリ消費は少ないでしょう。 速度的に見た場合も、下のほうが速いと予想(一時領域としてヒープから割り当てずにスタックから取るかも?)。 とはいえ、どちらも実行環境とJavaVMの実装とに依存する部分があります。たとえば極端な話し、64bitのプラットフォームで、VMがint型の格納領域でも常に64bitずつ割り当てるが、配列の場合では要素数分全体でのサイズを64bit境界に合わせて割り当てるようになっている、というようなこともあり得るでしょう(これだと、メモリ効率は配列の方が良い)。 試すのもそう手間ではないでしょうから、重要なことであれば実地試験をお勧めします。
その他の回答 (3)
- osumitan
- ベストアンサー率33% (102/307)
配列のインスタンスを生成しなくてすむ分だけ 下の方がメモリ消費も確保スピードもよいように思えます。 それより気になるのは、こんな宣言の仕方して この変数を使う処理がうまく書けるのかな?ってことですねw べたっとintを21個ならべてもかまわないのであれば int[] kazu = new int[21]; でいいんじゃない?という気が個人的にはします。
お礼
自分も下のほうが早いのかと思ったんですが。 ご意見、どうもありがとうございます。
- raiden0816
- ベストアンサー率0% (0/3)
配列は参照として扱われます。 ということであればどちらが有利か・・・
お礼
配列は参照として扱われるんですか! なるほど~ ありがとうございます!!
- SAYKA
- ベストアンサー率34% (944/2776)
場合によって様々。 一般的にはそれなら int kazu[6][3] じゃない? 質問文前者は3つずつ連続でとっているけど他の処理が間に挟まる(別のアプリ)と3つずつだけどメモリとしては連続しない場合が有るね {kazu1[3]}{別のアプリの確保}{kazu2[3]}……… (概念の話なので通常はほぼ起きない。理由は省略。ヒープ辺りで調べてみて) 質問文後者はさらに同じ理由で、かつプログラム内ですら連続メモリであるかは保証できなくなるね。 連続していないメモリの確保が いかに遅くなるものなのかは10や20じゃ判らないけれど1000や2000とかになると結構でてくるね 最近のPCは早いけどサーバはまだ遅かったり、接続数が多かったりすると100や200でも影響は出るかもしれないけれどそれはどこで稼働させるかによる。 メモリ消費量は 理論的にはどれも一緒。 ただし「ブロック」「ページ」という概念が有るので小さすぎる領域を分散確保した場合は別
お礼
連続していないメモリの確保が いかに遅くなるものなのかは10や20じゃ判らないけれど1000や2000とかになると結構でてくるね なるほど どうもです!!!!
お礼
なるほどいろいろありがとうございます。 ためすのが確実ということなんですね いろいろ教えていただきありがとうございます!