回答編集履歴

2

「念の為」部分の位置を修正

2019/10/19 12:51

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -24,6 +24,14 @@
24
24
 
25
25
 
26
26
 
27
+ 念の為:例えばこういった関係になってますね。
28
+
29
+ - 0xffffcbe8(yの番地)+ 8 = 0xffffcbf0(xの番地)
30
+
31
+ - 0xffffcbf8(bの番地)+ 4 = 0xffffcbfc(aの番地)
32
+
33
+
34
+
27
35
  これは実は
28
36
 
29
37
  - double 型の変数 y, x がそれぞれ8バイト(64bit)の領域を占めている
@@ -35,12 +43,6 @@
35
43
 
36
44
 
37
45
  ことを示しています(括弧内に書き加えたアドレスは、各変数に割り当てられた、最後のメモリのアドレス)。
38
-
39
- 念の為:例えばこういった関係になってますね。
40
-
41
- - 0xffffcbe8(yの番地)+ 8 = 0xffffcbf0(xの番地)
42
-
43
- - 0xffffcbf8(bの番地)+ 4 = 0xffffcbfc(aの番地)
44
46
 
45
47
 
46
48
 

1

「たまたま密着」を修正。ほかに軽微な修正を。

2019/10/19 12:51

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -36,6 +36,12 @@
36
36
 
37
37
  ことを示しています(括弧内に書き加えたアドレスは、各変数に割り当てられた、最後のメモリのアドレス)。
38
38
 
39
+ 念の為:例えばこういった関係になってますね。
40
+
41
+ - 0xffffcbe8(yの番地)+ 8 = 0xffffcbf0(xの番地)
42
+
43
+ - 0xffffcbf8(bの番地)+ 4 = 0xffffcbfc(aの番地)
44
+
39
45
 
40
46
 
41
47
  というのは、この8バイト、4バイトという値(大きさ)は、double, int という、それぞれの型の変数に必要なメモリの大きさだからです。これらの大きさは sizeof() で確認できますので、質問者も次のようなコードで確かめてみると良いです。
@@ -50,17 +56,17 @@
50
56
 
51
57
 
52
58
 
53
- 変数 y, x, b, a は関数内のローカル変数なのでスタック領域に割り当てられているはずです。そのアドレスが0xffffcbe8~0xffffcbffというメモリ領域に変数が割り当てれていますので、おおよそこの辺りがスタック領域となっているようだとわかります(スタックという言葉がわからなければコメントなり新たな質問をたてるなしてください)。スタック領域がどこになるか、いつも同じではありません。コンパイラによって、OSによって、プログラムによって、様々な条件で大きく変わります。
59
+ 変数 y, x, b, a は関数内のローカル変数なのでスタック領域に割り当てられているはずです。そのアドレスが0xffffcbe8~0xffffcbffなのだから、おおよそこの辺りがスタック領域となっているようだとわかります(スタックという言葉がわからなければコメントなり新たな質問をたてるなしてください)。スタック領域がどこになるか、いつも同じではありません。コンパイラによって、OSによって、プログラムによって、様々な条件で大きく変わります。
54
60
 
55
61
 
56
62
 
57
63
  注意すべきは y, x, b, a という順序はコンパイラが勝手に決めてよいことになっているので、常にこの順序になると思ってはいけない事です。この場合はたまたまそういう順序になったのです。
58
64
 
59
- は「密着」と書きしたが、いつも密着しているとも限りません。この場合はたまたま密着したのです。
65
+ の例は「密着」していが、いつも密着しているとも限りません。~~この場合はたまたま密着したのです。~~この場合は、double型変数が2つ、int型変数が2つという組み合わせは密着が可能だということになります。密着しなかった=隙間ができた実例がZuihsinさんの回答にあります。ただ、あのコードなら必ず隙間ができるかというと、そうでもありません。質問者がご自分で試してみるとよいと思います。
60
66
 
61
67
 
62
68
 
63
- ひとつ簡単な実験をしてみるのも面白いと思います。それは変数を定義する順序を変えてみることです。例えば今
69
+ もうひとつ簡単な実験をしてみるのも面白いと思います。それは変数を定義する順序を変えてみることです。例えば今
64
70
 
65
71
 
66
72
 
@@ -84,4 +90,4 @@
84
90
 
85
91
 
86
92
 
87
- があります。のうち2種類はGCCですが(どちらもGCCなのに)この振る舞いが異なりました。ことほどさように、変数がメモリ上にどう配置されるかはコンパイラ次第です。確かめてみないとわからないのです、もっともそんなことを気にしてプログラムを書くことは少ないですが。
93
+ があります。3つのうち2はGCCですが(どちらもGCCなのに)この振る舞いが異なりました。ことほどさように、変数がメモリ上にどう配置されるかはコンパイラ次第です。アドレスは確かめてみないとわからないのです、もっともそんなことを気にしてプログラムを書くことは少ないですが。