teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

修正

2016/03/13 14:24

投稿

退会済みユーザー
answer CHANGED
@@ -8,4 +8,8 @@
8
8
 
9
9
  メモリの解放をいちいちコードに書くのは面倒なので,最近のプログラミング言語は自動でメモリを解放してくれる機能がついているようなものもありますが,言語仕様でメモリがどのように確保され解放されるか知っておくことは,それをイメージしながらプログラミングすることで,無駄がなく早いコードを書くことにもつながります。
10
10
 
11
- 基本的にオブジェクトのインスタンスは動的メモリ確保をするデータだと思ってください(何個生み出されるか実行前にわからないため)。
11
+ 基本的にオブジェクトのインスタンスは動的メモリ確保をするデータだと思ってください(何個生み出されるか実行前にわからないため)。
12
+
13
+ ゲームプログラミングはこのオブジェクトのインスタンスをよく使うことになり,それぞれを使う時には,そのオブジェクトが他のオブジェクトに使用されているかどうかという参照カウントという値を使用することが多いです。これはスマートポインタという仕組みがよく使われます。オブジェクトが生み出されて使われるごとに参照カウントを+1して,使い終わると値を-1減少させます。参照カウントが0になったらオブジェクトのデストラクタが起動するという仕組みになっています。
14
+
15
+ メモリの自動解放はこのような単純な仕組みになっていますのでメモリが解放できずに困った時は,自分で書いて直したりパフォーマンスを上げることもできるようになります。

3

補足

2016/03/13 14:24

投稿

退会済みユーザー
answer CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  なので,メモリのアドレスを保存しておける領域を作って,データが生み出される時に確保されたメモリのアドレスの値を保存することで管理しているわけです(Cはこのメモリのサイズもデータが生み出される時にデータのサイズを計算してmallocという関数を使ってメモリを確保しなければいけませんでした)。
6
6
 
7
- しかし,この保存したアドレスの値を消去したところで,そのアドレスが指し示しているメモリの場所は明示的に解放されないのです。もしこのメモリが解放されていないまま,プログラムを回し続けるともう使われていないデータが蓄積されてしまい,色々よくないことが起きます。なのでメモリを解放する処理をプログラムに書く必要があり,どのタイミングでメモリを解放すべきかということの理解がコンピュータのパフォーマンスを考える上で重要なのです。
7
+ しかし,この保存したアドレスの値を消去したところで,そのアドレスが指し示しているメモリの場所は明示的に解放されないのです。もしこのメモリが解放されていないまま,プログラムを回し続けるともう使われていないデータが蓄積されてしまい,色々よくないことが起きます(例えばメモリの使用率が100%を超えるとプログラムがクラッシュして実行中の処理が止まったりします)。なのでメモリを解放する処理をプログラムに書く必要があり,どのタイミングでメモリを解放すべきかということの理解がコンピュータのパフォーマンスを考える上で重要なのです。
8
8
 
9
9
  メモリの解放をいちいちコードに書くのは面倒なので,最近のプログラミング言語は自動でメモリを解放してくれる機能がついているようなものもありますが,言語仕様でメモリがどのように確保され解放されるか知っておくことは,それをイメージしながらプログラミングすることで,無駄がなく早いコードを書くことにもつながります。
10
10
 

2

表現の変更

2016/03/13 14:11

投稿

退会済みユーザー
answer CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  なので,メモリのアドレスを保存しておける領域を作って,データが生み出される時に確保されたメモリのアドレスの値を保存することで管理しているわけです(Cはこのメモリのサイズもデータが生み出される時にデータのサイズを計算してmallocという関数を使ってメモリを確保しなければいけませんでした)。
6
6
 
7
- しかし,この保存したアドレスの値を消去したところで,そのアドレスが指し示しているメモリの場所は明示的にされないのです。もしこのメモリが解放されていないまま,プログラムを回し続けるともう使われていないデータが蓄積されてしまい,色々よくないことが起きます。なのでメモリを解放する処理をプログラムに書く必要があり,どのタイミングでメモリを解放すべきかということの理解がコンピュータのパフォーマンスを考える上で重要なのです。
7
+ しかし,この保存したアドレスの値を消去したところで,そのアドレスが指し示しているメモリの場所は明示的に解放されないのです。もしこのメモリが解放されていないまま,プログラムを回し続けるともう使われていないデータが蓄積されてしまい,色々よくないことが起きます。なのでメモリを解放する処理をプログラムに書く必要があり,どのタイミングでメモリを解放すべきかということの理解がコンピュータのパフォーマンスを考える上で重要なのです。
8
8
 
9
9
  メモリの解放をいちいちコードに書くのは面倒なので,最近のプログラミング言語は自動でメモリを解放してくれる機能がついているようなものもありますが,言語仕様でメモリがどのように確保され解放されるか知っておくことは,それをイメージしながらプログラミングすることで,無駄がなく早いコードを書くことにもつながります。
10
10
 

1

補足

2016/03/13 14:09

投稿

退会済みユーザー
answer CHANGED
@@ -1,4 +1,4 @@
1
- もしメモリが管理されていなかった場合PCは手当たり次第メモリにデータを書き込むことになり計算中のデータが消えてしまいますよね。
1
+ もしメモリが管理されていなかった場合PCは手当たり次第メモリにデータを書き込むことになり書きむ場所に保存されているデータが存在していた場合そのデータは消えてしまいますよね。
2
2
 
3
3
  これを防ぐために保存するデータのメモリをロックしておくわけです。静的な型付け言語では,あらかじめ実行前に使うメモリの容量が解っている静的なデータはプログラムが実行される前にコンパイラがメモリを確保できるか調べて確保してくれますが,プログラムが実行する人の操作でデータのサイズが変わるような動的なデータはあらかじめどれくらいのメモリを使うかということをプログラムが判断することができません。
4
4