2016-12-21 13 views
2

は、私は次のコードがあるとします。list aためHaskellのリスト構築とメモリ使用量

a = reverse b 
doSomething a 

ウィルメモリは、実際に割り当てられる、またはdoSomethingは単にリストbを再利用するのでしょうか?メモリが割り当てられる場合、それを避ける方法はありますか?逆のリストが必要なだけでメモリ使用量が倍増しても、特にいいとは言えません。

+4

難しいと伝えます。リストの背骨は恐らく重複してしまうでしょう - これは、1)それを避けることができる多くの最適化があり、2)怠惰により、新しいリストが作成されるとすぐにそれを消費することが可能になり、新しい背骨が実際に一定量のメモリを消費するようにします。いずれにしても、リストの要素は複製されません(スパインのみ)。 – chi

+1

あなたの他のユースケースにもよりますが、リストの代わりに[Data.Sequence](https://hackage.haskell.org/package/containers-0.5.9.1/docs/Data-Sequence.html)を使う方が良いでしょうとにかく... – mb21

答えて

0

最悪の場合、abの両方が全体としてメモリに存在します。その場合でも、の内容はであることに注意してください.2つのリストは1つだけ存在し、両方のリストの間で共有されるので、2つのリストの「背骨」についてのみ話しています。

bがどのように定義されていて、何がdoSomethingであるかによって、コンパイラは、リストを処理するタイトな定数空間ループに全体を変えることができますおそらくメモリ割り当てを一切必要としません。多分。

しかし、非常に最悪の場合でも、リストの背骨を複製しています。実際の要素のリストに複製することは決してありません。

(それぞれのノードは、どのような3つのポインタですか?)