weigh (https://www.fpcomplete.com/blog/2016/05/weigh-package) is a library measures how much allocation evaluating a function causes. It's basically a nice interface to GHC.Stats.getGCStats.

Here is an example that measures \n -> n+1:

    import Weigh
    
    main :: IO ()
    main = mainWith (func "+1" plusOne 5)

    plusOne :: Int -> Int
    plusOne = \n -> n + 1

which prints

    Case  Bytes  GCs  Check
    +1       16    0  OK   

when run (64 bit machine; allocating 1 Int = 16 bytes).

So my question is, what about the thunk allocated by (+)? My rough understanding of the heap is this:

Code          Heap
----          ----
               1        1         1         1    1
plusOne 1     +-------+----------+----+    +----+---+
              | THUNK | reserved |  --|--> | I# | 5 |
              +-------+----------+----+    +----+---+

               1       1          1         1    1
deepseq it    +-------+----------+----+    +----+---+
              | IND   |          |  --|--> | I# | 5 |
              +-------+-----|----+----+    +----+---+
                            |               1    1
                            `------------> +----+---+
                                           | I# | 6 |
                                           +----+---+

               1     1
GC            +----+---+
              | I# | 6 | 
              +----+---+

So haven't we allocated 5 bytes, not two? Three for the GC'd thunk, and two for the new Int?

Any clarification or pointers (heh) to some GHC reading would be greatly appreciated!

Thanks,
Mitchell