回答編集履歴

2

追加

2021/04/14 00:49

投稿

amiya
amiya

スコア1218

test CHANGED
@@ -34,6 +34,42 @@
34
34
 
35
35
 
36
36
 
37
+ ---
38
+
39
+
40
+
41
+ ついでに、ではもしnewされたものが、参照型のものであったなら、ですが、
42
+
43
+ この場合は、GCの対象になるのは、そのインスタンスへの参照が1つもなくなった時です。
44
+
45
+ GCは全ての参照変数の参照先をチェックして、それを元に各インスタンスに参照されているかどうかのマークを付けます。
46
+
47
+ その結果、マークされていない=どの変数からも参照されていないインスタンスはGCの対象となります。
48
+
49
+
50
+
51
+ このコードでいえば、`mat`に参照が代入された時点で、インスタンスは参照されている状態です。
52
+
53
+ 確かに、このまま何もせずに、`mat`が無効になれば、どこからも参照が無くなり、GCの対象となります。
54
+
55
+ しかし、このコードでは、`return mat;`として、メソッドの外にインスタンスへ参照を返しています。
56
+
57
+ 当然、このメソッドを呼び出した側では、それを受け取っていると思います。(絶対ではないですが)
58
+
59
+ この外部の参照がある限り、たとえメソッドの終了により、`mat`が破棄されても、
60
+
61
+ 作られたインスタンスの参照は無くなりません。
62
+
63
+ その為、メソッドの終了後もその参照がある限りインスタンスはGCの対象にはならず、生き続けます。
64
+
65
+ (もしメソッドを呼び出した側が返り値を受け取っていなければ、メソッドの終了時点でGC対象になります)
66
+
67
+
68
+
69
+ 作られた場所がstaticメソッドであるかどうかは、あまり関係がありません。
70
+
71
+ (staticメソッドであっても、ローカル変数は呼ばれるたびに作られ終了と共に解放されます)
72
+
37
73
 
38
74
 
39
75
 

1

訂正

2021/04/14 00:49

投稿

amiya
amiya

スコア1218

test CHANGED
@@ -1,8 +1,50 @@
1
+ いろいろ勘違いがあったようですm(_ _)m
2
+
3
+
4
+
5
+ `Matrix4x4`や`Vector4`は、値型であるためスタックメモリの上に作られます。
6
+
7
+ `mat`は`Matrix4x4`型のため、スタックメモリに確保され、=によって直接値が代入されます。
8
+
9
+ その後の操作を経て、`return mat;`に到達したとき、
10
+
11
+ 呼び出し元へと値を返すために、`mat`の値のコピーが作られます。
12
+
13
+ そして、メソッドの終了と共に、スタックメモリ上にある`mat`の情報は解放されます。
14
+
15
+ スタックメモリ上にあるデータは、GCの管理外なので、GCは関わってきません。
16
+
17
+
18
+
19
+ 呼び出し元には、さっき作ったコピーの値が渡されます。
20
+
21
+ 呼び出し元が変数を用意してそれを受け取っていた場合、その値がその変数へと格納されて、
22
+
23
+ コピー自体は役目を終えて消えます。
24
+
25
+
26
+
1
27
  > このnewしたVectorはmatが参照されなくなってGCが走ると破棄される、で理解はあっていますでしょうか?
2
28
 
3
29
 
4
30
 
31
+ なので、参照とは関係なく、この時newしたVectorそのものは、メソッドの終了と共に破棄されます。
32
+
33
+ しかし、returnを通じて、その値のコピーは呼び出し元に渡される。といった感じになるかと思います。
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+ ---
42
+
43
+ > このnewしたVectorはmatが参照されなくなってGCが走ると破棄される、で理解はあっていますでしょうか?
44
+
45
+
46
+
5
- GCの対象になるのは、そのインスタンスへの参照が一つもなくなった時です。
47
+ ~~GCの対象になるのは、そのインスタンスへの参照が一つもなくなった時です。
6
48
 
7
49
  このコードでいえば、`mat`に参照が代入された時点で、インスタンスへの参照は1となります。
8
50
 
@@ -18,10 +60,10 @@
18
60
 
19
61
  その為、メソッドの終了後もその参照がある限りインスタンスはGCの対象にはならず、生き続けます。
20
62
 
21
- (もしメソッドを呼び出した側が返り値を受け取っていなければ、メソッドの終了時点でGC対象になります)
63
+ (もしメソッドを呼び出した側が返り値を受け取っていなければ、メソッドの終了時点でGC対象になります)~~
22
64
 
23
65
 
24
66
 
25
- 作られた場所がstaticメソッドであるかどうかは、あまり関係がありません。
67
+ ~~作られた場所がstaticメソッドであるかどうかは、あまり関係がありません。
26
68
 
27
- (staticメソッドであっても、ローカル変数は呼ばれるたびに作られ終了と共に解放されます)
69
+ (staticメソッドであっても、ローカル変数は呼ばれるたびに作られ終了と共に解放されます)~~