b...@bullno1.com wrote: > I have read a few threads on lmdb alignment but I am still not clear on what > kind of padding should be done. > > Use case: I want to store aligned SIMD vectors in the value and operate on > them directly with SIMD instructions without copying. > > As I understand it, lmdb guarantees 2-byte alignment. > However, it can also move nodes around for tree rebalancing or page > reclaiming. > Thus, merely aligning the key and value might not be enough. > > Right now, based on my reading of the code, I'm assuming that the data layout > in a leaf page is like this: > > [page_header][mp_ptrs]...[node_header][key][value][node_header][key][value] > > Basically, nodes are stored contiguously in memory with `node_header` and > `key` always aligned to 2-byte. > New nodes are allocated from the bottom of the page and offsets are > stored/allocated into MDB_page.mp_ptrs from the top. > Is this correct?
No. > > If so, to ensure that `value` has a certain alignment, even when accounting > for nodes being moved around, one would also have to ensure that > `sizeof(node_header) + sizeof(key) + sizeof(value)` is a multiple of the > alignment. > Is this reasoning correct? No. > > For the overflow page, is the structure similar? Just that one single page > header is used for a number of contiguous pages. > -- -- Howard Chu CTO, Symas Corp. http://www.symas.com Director, Highland Sun http://highlandsun.com/hyc/ Chief Architect, OpenLDAP http://www.openldap.org/project/