libpmemobj-cpp icon indicating copy to clipboard operation
libpmemobj-cpp copied to clipboard

Use self-relative ptrs in containers

Open igchor opened this issue 5 years ago • 2 comments

Rationale

Current implementation of libpmemobj-cpp is based on persistent_ptr which is in fact a fat pointer. It stores PMEMoid which consists of two 64 bit fileds: pool_uuid and offset. Every dereference of peristent_ptr requires a call to pmemobj_direct function which calculates real address based on PMEMoid. Because of the nature of pmemobj_direct calls to this function cannot be optimized by the compiler and as a result using persistent_ptr is much slower than regular pointers.

Proposal

To address performance problems of peristent_ptr new pointer type with offset addressing model could be introduced. This new type of pointer would have only one 64 bit field: offset. Pointer value would be equal to offset + address of the pointer itself. This pointer would allow compiler to perform much better optimizations as no pmemobj function is required to be called during dereference. Additional benefit over persistent_ptr is smaller size.

The only limitation of this new type of pointer is that it cannot point to objects in another pool.

igchor avatar Jan 30 '19 15:01 igchor

Ref: https://github.com/pmem/libpmemobj-cpp/pull/810

igchor avatar Aug 25 '20 13:08 igchor

After implementing self_relative_ptr we should use it (or allow using it via template param) in cotnainers.

igchor avatar Aug 25 '20 13:08 igchor