CTMacUser
(Daryle Walker)
1
For an enum case that is indirect, since the size of each sub-instance is already known at that point, is the space for the new case allocated in a single block? Or is each sub-instance allocated separately on the heap? (Or has this changed over the years?)
If not implemented, could it be changed to be a single block? (Or if it used to be, then why was it stopped.)
DaveZ
(David Zarzycki)
2
Can you rephrase your question? The point of indirect is to allow recursive data structures because the "size of" the case payload isn't knowable at compile time.
1 Like
CTMacUser
(Daryle Walker)
3
Let's start with:
enum Tree<T> {
case leaf(value: T)
indirect branches(left: Tree, right: Tree)
}
When a Tree instance is a .leaf, that instance's data can be stored in a byte block the size of T. It's probably bigger to handle both the accounting data for .branches and the tag. When the instance is .branches, there are two sub-instances to store. Does the direct data for the instance hold a heap pointer for .left, and a separate one for .right, or are their heap data blocks put together into a single data block and that's what the direct data points to?
For examples, a .leaf instance has a local allocation of T's memory stride (let's call it m). A .branches instance with two leaves as its trees has a local allocation of a pointer and a heap allocation of 2 times m. A different .branches instances with one branch being the previous instance and another being a leaf would have a local allocation of a pointer and a heap allocation of 3 times m.
Joe_Groff
(Joe Groff)
4
There is only one heap allocation for the entire payload.