diff --git a/1.9/ja/book/the-stack-and-the-heap.md b/1.9/ja/book/the-stack-and-the-heap.md index ebee9c65..74a16b2e 100644 --- a/1.9/ja/book/the-stack-and-the-heap.md +++ b/1.9/ja/book/the-stack-and-the-heap.md @@ -1,4 +1,5 @@ % スタックとヒープ + +分かりやすいようにちょと変な名前をつけています。 + -いいですか、まず、 `main()` を呼び出します: +それでは、まず、 `main()` を呼び出します: | Address | Name | Value | |---------|------|-------| | 0 | x | 42 | -次に、 `main()` は `foo()` を呼び出します: +次に、 `main()` は `bold()` を呼び出します: | Address | Name | Value | |---------|------|-------| -| 3 | c | 1 | -| 2 | b | 100 | -| 1 | a | 5 | +| **3** | **c**|**1** | +| **2** | **b**|**100**| +| **1** | **a**| **5** | | 0 | x | 42 | -そして `foo()` は `bar()` を呼び出します: +そして `bold()` は `italic()` を呼び出します: | Address | Name | Value | |---------|------|-------| -| 4 | i | 6 | -| 3 | c | 1 | -| 2 | b | 100 | -| 1 | a | 5 | +| *4* | *i* | *6* | +| **3** | **c**|**1** | +| **2** | **b**|**100**| +| **1** | **a**| **5** | | 0 | x | 42 | -`bar()` が終了した後、そのフレームはデアロケートされて `foo()` と `main()` だけが残ります: +`italic()` が終了した後、そのフレームはデアロケートされて `bold()` と `main()` だけが残ります: | Address | Name | Value | |---------|------|-------| -| 3 | c | 1 | -| 2 | b | 100 | -| 1 | a | 5 | +| **3** | **c**|**1** | +| **2** | **b**|**100**| +| **1** | **a**| **5** | | 0 | x | 42 | -そして `foo()` が終了すると `main()` だけが残ります: +そして `bold()` が終了すると `main()` だけが残ります: | Address | Name | Value | |---------|------|-------| @@ -392,7 +398,7 @@ location we’ve asked for. We haven’t really talked too much about what it actually means to allocate and deallocate memory in these contexts. Getting into very deep detail is out of the scope of this tutorial, but what’s important to point out here is that -the heap isn’t just a stack that grows from the opposite end. We’ll have an +the heap isn’t a stack that grows from the opposite end. We’ll have an example of this later in the book, but because the heap can be allocated and freed in any order, it can end up with ‘holes’. Here’s a diagram of the memory layout of a program which has been running for a while now: @@ -518,7 +524,7 @@ What about when we call `foo()`, passing `y` as an argument? | 0 | x | 5 | これは、変数を借用してもどのメモリもデアロケートされることがないことのひとつの理由になっています。 -つまり、参照の値はメモリ上の位置を示す単なるポインタです。 +つまり、参照の値はメモリ上の位置を示すポインタです。 もしポインタが指しているメモリを取り去ってしまうと、ことが立ちゆかなくなってしまうでしょう。 # 複雑な例 @@ -681,11 +687,11 @@ Next, `foo()` calls `bar()` with `x` and `z`: その結果、ヒープに値をもうひとつアロケートすることになるので、(230) - 1から1を引かなくてはなりません。 -そうすることは、単に `1,073,741,822` と書くよりは簡単です。 +そうすることは、 `1,073,741,822` と書くよりは簡単です。 いずれにせよ、いつものように変数を準備します。 スタックのほうが速くて管理しやすいというのであれば、なぜヒープが要るのでしょうか? -大きな理由のひとつは、スタックアロケーションだけしかないということはストレージの再利用にLIFOセマンティクスをとるしかないということだからです。 +大きな理由のひとつは、スタックアロケーションだけしかないということはストレージの再利用に「Last In First Out(LIFO)(訳注: 後入れ先出し)」セマンティクスをとるしかないということだからです。 ヒープアロケーションは厳密により普遍的で、ストレージを任意の順番でプールから取得したり、プールに返却することが許されているのですが、よりコストがかさみます。 -スタックのメモリを管理するのは些細なことです: 機械は「スタックポインタ」と呼ばれる単一の値を増減するだけです。 -ヒープのメモリを管理するのは些細なことではありません: ヒープアロケートされたメモリは任意の時点で解放され、またヒープアロケートされたそれぞれのブロックは任意のサイズになりうるので、一般的にメモリマネージャは再利用するメモリを特定するためにより多く働きます。 +スタックのメモリを管理するのは些細なことです: 機械は「スタックポインタ」と呼ばれる単一の値を増減します。 +ヒープのメモリを管理するのは些細なことではありません: ヒープアロケートされたメモリは任意の時点で解放され、またヒープアロケートされたそれぞれのブロックは任意のサイズになりうるので、一般的にメモリマネージャは再利用するメモリを特定するためにより多くの仕事をします。