- ベストアンサー
変数 と 配列
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; と変数宣言とでは どちらがどちらが メモリ消費 を抑えれますか? 確保スピードが速いですか? 教えてください
- startover
- お礼率91% (121/132)
- Java
- 回答数4
- ありがとう数5
- みんなの回答 (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とかになると結構でてくるね なるほど どうもです!!!!
関連するQ&A
- 配列変数の宣言「その2」
「その2」 「その1」でも述べましたが、配列変数の宣言の仕方は2種類あると思います。 (1)・・・ int hairetu[]; (2)・・・ int [] hairetu; この宣言をした後、init()メソッドを使いこの2つの配列変数の範囲(?)を指定したいと思います。 (1)の指定方法・・・ hairetu = new int[10]; (2)の指定方法・・・ hairetu[] = new int[10]; (2)を指定するときは(1)の指定方法が使えませんでした。これはなぜでしょうか? 逆に、(1)を指定するときには(1)は配列変数であるにもかかわらず、[] なしでも指定ができるのでしょうか? 知っていれば教えてください。
- ベストアンサー
- Java
- c# 配列変数の宣言について
c#の配列変数の宣言についてですが、 以下の2つの宣言は同じことなのでしょうか。 (1)int[] num = {1,2,3}; (2)int[] num = new int{1,2,3}; 本では(2)のような定義していますが何かルールのようなものがあるのでしょうか。 宜しくお願いします。
- ベストアンサー
- C・C++・C#
- C# 配列の変数宣言について。
C#についての質問です。 新たなint型の配列dataを作るため変数宣言文を、以下のように書きました。 int[] data; すると、以下のような警告文が出ました。 『フィールド'IntArray.data'は割り当てられません。常に既定値nullを使用します。』 そこで調べてみたところ、「newしていないからこのような警告文が出る」ということがわかったので、以下のように書き換えました。 private int[] data = new int[]; すると今度は 『配列を作成するには、配列のサイズまたは配列の初期化子を指定する必要があります。』 というエラー文が出てしまいました。 このとき、配列のサイズも初期化子も指定したくない場合には、どのようにプログラムを書けば良いのでしょうか? お分かりになる方がいらっしゃいましたら、ご助言をお願いします。
- ベストアンサー
- C・C++・C#
- 配列変数の宣言「その1」
「その1」 僕の見たことのある配列変数の宣言の仕方は2種類あります。 (1)・・・ int hairetu[]; (2)・・・ int [] hairetu; 現在は配列変数であることが分かりやすいという点で (2)が推奨されているというようなことは本で読んだことがあります。 今まではどちらかというと(1)をよく使っていました。 そこで、みなさんのご意見を聞いて、 今後どちらを使うのか考えてみたいと思いました。 (1)の良い所や良くない所、(2)の良い所や良くない所などもあれば教えてほしいです。
- ベストアンサー
- Java
- 配列と変数について
練習のため家庭の収入、支出のバランスを計算するプログラミングを作っています。その為変数宣言についてなのですが以下のようにすると配列をcoutした時にint の変数に代入した値と一致しません。意味不明な数字が表示されます。この時何が起きているのでしょうか(この数字はどこから?各配列には何が入っているのでしょうか?)。 #include <iostream.h> int main (){ int income, loan, expenditure, saving; int cluster []={income, loan, expenditure, saving}; income=100, loan=200, expenditure =300, saving = 500; cout << cluster [0]<<endl<<cluster [2]<<endl<<income<<endl<<expenditure; return 0; } しかしながら以下のように変数の初期化を配列への代入の前に行うと各配列と変数の値が一致します。何故ですか? #include <iostream.h> int main (){ int income, loan, expenditure, saving; income=100, loan=200, expenditure =300, saving = 500; int cluster []={income, loan, expenditure, saving}; cout << cluster [0]<<endl<<cluster [2]<<endl<<income<<endl<<expenditure; return 0; } 2.今回配列を使ったのはこれらの変数をまとまりとして取り扱ったほうが便利だと思ったからです。この様な場合クラスを作ったほうが良いのでしょうか?メモリ的に配列の方がまとまりが良いように感じましたが、そんな考慮は必要ないのでしょうか? 3.変数名を表示することは出来ますか?上記のincome、savingなどです。
- ベストアンサー
- C・C++・C#
- 配列に添え字を書かないと・・・
java初心者です。 配列として宣言した変数(?)に、添え字を書かないとどういう処理をするのでしょうか? 例えば、 int[] n = new int[10]; という書き方をしたのに、使うときに n というのを何の添え字もつけずに使っているようなのですが・・。 よろしくお願いします。
- 締切済み
- Java
- 多次元配列の動的メモリ
1次の配列aの動的メモリは例えば 「double *a; int num = 3; //配列の数 a = new double [3];」 などとすれば確保できることは分かるのですが、 二次元配列など、多次元配列の動的メモリは どのようにすれば確保できるのですか?
- 締切済み
- C・C++・C#
- 配列の要素数に変数を入れたいときには
よろしくお願いします。 配列の要素数には定数しか入れられないのですが,どうしても変数を入れたいときは,それを引数として関数を呼び出すしか方法はないでしょうか。 具体的には,scanfで手に入れたint型の変数を要素数とする配列を宣言したいのですが,どうすれば良いでしょうか。 ご教授ください。
- ベストアンサー
- C・C++・C#
- 「配列変数」て何ですか!?
#include <stdio.h> #include <string.h> int main() { int suuretsu[10]; int *p; for ( p = suuretsu; *p != 0; p++ ){ printf("p=%p *p=%d\n", p, *p); } } 以上のプログラムで! 「配列変数」が”どこ”に当たるのか ?いまいちピンとこないです!。 参考書にも「配列変数」の解説がありません! ググッたら・違ったプログラムでの解説はあり、 なんとなく分かりはしました。 しかし!プログラムが変わるとニュアンスの違いで! また違った関係があるみたいでいまいち分かりません-- ここでいう、「配列変数」はどこに当たりますか!? 宜しくお願いします。
- ベストアンサー
- C・C++・C#
- 配列と他の変数のメモリ領域重複の問題について質問
dsPICで配列を使用する際、他の変数もその配列の存在するメモリ領域に配置されてしまいます。 プログラムにはC言語を用いています。環境は「MPLAB C30 v3.31」、「MPLAB LINK30 v3.31」「MPLAB v8.85」です。 状況としてはunsigned char型で要素数320の配列をグローバル宣言します。そしてmain関数やその他の関数内でローカル変数を宣言するとその変数が配列の中に存在することになってしまうというものです。色々試したところ、そのローカル変数をstaticで宣言するとそのような症状は出なくなりました。 この現象には、初期化をする関数内でカウンタとしてローカル変数を宣言し、for文で配列を0でクリアさせようとしたところ、MPLABSIMでデバッグすると永久ループしたことから気づきました。Watchを用いて確認したところ配列の中にそのカウンタ変数が配置されていたため最終的に自分自身を0でクリアしてしまうことで永久ループしてしまうことがわかりました。 なぜこうなるのかよくわかりません。この配列以外にはおおきな領域を必要とする変数は宣言していませんのでData memoryの容量的な問題ではないと思っています。staticで宣言すれば何とかなりますが、これでは無駄なメモリを消費してしまいます。また、絶対アドレス指定をする方法もありますが、「ignoring address attribute applied to automatic 変数名」というwarningがでて結局出来ませんでした。 。 このような現象を起こさせない様にするため,、確実にメモリを確保するためにはどうすればよいのでしょうか。 この問題のために先に進めず、大変困っております。どうかご教授ください。 もう一つ、変数の生存期間について質問なのですが、ある関数内で宣言したローカル変数をカウンタとして使い、指定の回数だけ他の関数を繰り返し実行する場合、他の関数に飛んだ時もそのローカル変数は確実に生存しているのでしょうか。重ねてお願いします。 不足がございましたら補足しますのでお教え下さい。
- ベストアンサー
- その他(プログラミング・開発)
お礼
なるほどいろいろありがとうございます。 ためすのが確実ということなんですね いろいろ教えていただきありがとうございます!