On Fri, Apr 8, 2016 at 8:07 AM, Jacques Nadeau <jacq...@apache.org> wrote: >> >> >> > I believe this choice was primarily about simplifying the code (similar >> to why we have a n+1 >> > offsets instead of just n in the list/varchar representations (even >> though n=0 is always 0)). In both >> > situations, you don't have to worry about writing special code (and a >> condition) for the boundary >> > condition inside tight loops (e.g. the last few bytes need to be handled >> differently since they >> > aren't word width). >> >> Sounds reasonable. It might be worth illustrating this with a >> concrete example. One scenario that this scheme seems useful for is a >> creating a new bitmap based on evaluating a predicate (i.e. all >> elements >X). In this case would it make sense to make it a multiple >> of 16, so we can consistently use SIMD instructions for the logical >> "and" operation? >> > > Hmm... interesting thought. I'd have to look but I also recall some of the > newer stuff supporting even wider widths. What do others think? > > >> I think the spec is slightly inconsistent. It says there is 6 bytes >> of overhead per entry but then follows: "with the smallest byte width >> capable of representing the number of types in the union." I'm >> perfectly happy to say it is always 1, always 2, or always capped at >> 2. I agree 32K/64K+ types is a very unlikely scenario. We just need >> to clear up the ambiguity. >> > > Agreed. Do you want to propose an approach & patch to clarify?
I can also take responsibility for the ambiguity here. My preference is to use int16_t for the types array (memory suitably aligned), but as 1 byte will be sufficient nearly all of the time, it's a slight trade-off in memory use vs. code complexity, e.g. if (children_.size() < 128) { // types is only 1 byte } else { // types is 2 bytes } Realistically there won't be that many affected code paths, so I'm comfortable with either choice (2-bytes always, or 1 or 2 bytes depending on the size of the union).