Subject: [Boost-bugs] [Boost C++ Libraries] #13141: Allow intrusive containers to work with relative pointers (ie with nodes stored in a vector)
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2017-07-28 05:23:14
#13141: Allow intrusive containers to work with relative pointers (ie with nodes
stored in a vector)
------------------------------+---------------------------
Reporter: fdegros@⦠| Owner: Ion Gaztañaga
Type: Feature Requests | Status: new
Milestone: To Be Determined | Component: intrusive
Version: Boost 1.64.0 | Severity: Optimization
Keywords: |
------------------------------+---------------------------
There is an interesting use case that Boost Intrusive containers don't
seem to support yet.
I would like to store the nodes of my collection in an std::vector. The
problem is: as nodes get pushed to the back of the vector, the vector
reaches capacity, reallocates its internal buffer and these nodes don't
stay at the same address. I therefore cannot use pointers (which hold an
absolute address) to chain these nodes together.
However, I would like to use indices to chain these nodes. I call that
index chaining. The idea is simple. Nodes stay at the same (relative)
index inside the vector even though the vector grows and reallocates its
internal buffer. Any node-based collection (linked list, red-black tree,
etc), can be stored in a contiguous area of memory and represented using
index chaining.
Think of the index as a relative pointer. This relative pointer needs some
context to be dereferenced: the vector in which the elements are stored.
There are several good reasons why we might want to store a node-based
data structure in a vector. It is more compact. It is more cache-friendly.
We can use shorter integers to represent indices (eg int32_t compared to
64-bit absolute pointers), which makes the nodes more compact and the
whole data structure more cache-friendly. All the nodes are colocated in a
single memory block. If the nodes are trivially destructible, deleting the
whole data structure is just a matter of deallocating a single memory
block.
Las, the different traits class that would have helped (pointer_traits,
node algorithms) are stateless and only work through static methods. And
offset_ptr doesn't cut it.
I haven't found a way to get Boost intrusive to work this way. I might not
be the only one trying. groups.google.com/forum/m/#!topic/boost-
list/PYKJlqT_wuw describes a similar, if not the same, request.
Consider supporting this feature. That would open Boost intrusive to the
realm of compact and relocatable node-based data structures.
-- Ticket URL: <https://svn.boost.org/trac10/boost/ticket/13141> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-07-28 05:26:14 UTC