質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

1回答

456閲覧

go lang のsliceのcapが増える理由

退会済みユーザー

退会済みユーザー

総合スコア0

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2020/01/03 17:28

package main import "fmt" func main() { var s []int printSlice(s) // append works on nil slices. s = append(s, 0) printSlice(s) // The slice grows as needed. s = append(s, 1) printSlice(s) // We can add more than one element at a time. s = append(s, 2, 3, 4) printSlice(s) } func printSlice(s []int) { fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s) }

s = append(s, 2, 3, 4) printSlice(s)がlen=5 cap=8 [0 1 2 3 4]とcapが8になるのはどうしてなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

appendして値を追加するときに、容量(capacity)が足りない場合は、新たに追加分も十分入れられるサイズのarrayを確保し、古いarrayから値をコピーして、その新しいarrayに値を追加する、といったことを行います。この新しいarrayの確保とarrayのコピーというのは、時間のかかる処理で、appendの時に、きっちり必要なだけのarrayのサイズに確保すると、appendのたびに、この処理が行われて、パフォーマンスが非常に悪くなります。これを避けるために、appendの時に必要より大きいサイズのarrayを確保することがあります。これがlen=5なのにcap=8となっている理由です。

このテクニックには、メモリが無駄になり得るという副作用があるので、どれだけのサイズを、いつ余分に確保するかというのは、実装によって異なるのではないかと思います。

ちなみに手元のgo version go1.13.5 windows/amd64では

len=5 cap=6 [0 1 2 3 4]

となりました。

投稿2020/01/03 19:35

Bearded-Ockham

総合スコア430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/04 02:53

ご回答ありがとうございます https://go-tour-jp.appspot.com/moretypes/15 のチュートリアルにあった内容なのですがlen=5 cap=6 [0 1 2 3 4]ということはチュートリアルが間違っていることになるのでしょうか?
Bearded-Ockham

2020/01/04 06:57 編集

その疑問については、すでに元の回答に答えがあります。 > このテクニックには、メモリが無駄になり得るという副作用があるので、どれだけのサイズを、いつ余分に確保するかというのは、実装によって異なるのではないかと思います。 つまり、capがこの場合いくつになるかは、goコンパイラのバージョンや対象OSなどによる可能性があるということです。Windowsでは6でも、Linuxでは8になるなどしても、何の不思議もないということです。
退会済みユーザー

退会済みユーザー

2020/01/04 17:02

ありがとうございます appendの引数の取り方で変わっているのかなと思っていたのでなぜ8になるのかがわからなかったのですが、そういうわけではなく勝手に?決まる数字だったのですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問