Здесь у меня есть простой контейнер multi_index, и мне интересно, есть ли способ заставить multi_index размещать элементы в памяти непрерывно. Я думал, что это было бы возможно, если бы основной индекс был random_access
.
Однако этот простой пример показывает, что неожиданно элементы не являются смежными в памяти. Существует ли комбинация boost::multi_index::indexed_by
, которая может привести к непрерывной памяти?
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
int main(){
typedef boost::multi_index_container<
double, // simply store doubles
boost::multi_index::indexed_by<
boost::multi_index::random_access<>
>
> random_access_container;
random_access_container v; // fill container
v.reserve(10); // also tried this
v.push_back(1.);
v.push_back(2.);
v.push_back(3.);
assert( v[0] == 1. ); // ok
assert( *(&v[0] + 1) == v[1] ); // this fails, memory is not contiguous
}
ПРИМЕЧАНИЕ 1. Я хочу это для совместимости (чтобы я мог воспользоваться контейнером multi_index
--с другими параметрами доступа--), но также использовать прямой доступ к памяти (как это возможно с std::vector
).
ПРИМЕЧАНИЕ 2. Я только что нашел эту цитату из документации, http://www.boost.org/doc/libs/1_61_0/libs/multi_index/doc/reference/rnd_indices.html#rnd_indices, так что это выглядит сложно.
Если не указано иное или если соответствующий интерфейс не существует, индексы произвольного доступа проверяют те же требования к контейнеру, что и std::vector, а также требования к конкретным операциям списка std::list в [list.ops]. Некоторые из наиболее важных отличий относительно std::vector:
Индексы произвольного доступа не обеспечивают непрерывность памяти и, следовательно, не имеют функций-членов данных.
...