Мне нужен статический массив векторов, инициализированный с помощью пользовательских распределителей, чтобы хранить мои данные (по 16 байт каждый) во внешнем оперативной памяти.Для этого я использую Говард Хиннант, короткое выделение , пока все хорошо.
Я использую GCC и C ++ 14:
Sequencer.h
using FixedVector = std::vector<SequencerNoteEvent, short_alloc<SequencerNoteEvent, kBytesChunkMax, 4>>;
/* memory pool */
static char sequencerNoteEvent[2][600] __attribute__((section(".masection")));
/* Declaration des différentes zones pour chaque vecteur */
static arena<600> arena0 __attribute__((section(".masection")));
static arena<600> arena1 __attribute__((section(".masection")));
/* Declaration des Vectors utilisants les pools */
static FixedVector v0 __attribute__((section(".masection")));
static FixedVector v1 __attribute__((section(".masection")));
Sequencer.cpp
// ---------------
// STATIC VARIABLE
// ---------------
char Sequencer::sequencerNoteEvent[kMaxChunks][kBytesChunkMax];
arena<kBytesChunkMax> Sequencer::arena0{Sequencer::sequencerNoteEvent[0]};
FixedVector Sequencer::v0{Sequencer::arena0};
arena<kBytesChunkMax> Sequencer::arena1{Sequencer::sequencerNoteEvent[1]};
FixedVector Sequencer::v1{Sequencer::arena1};
Я начал с 2 пулами памяти, но мне нужно 98304 из них ... И я полностью застрял вИнициализирую их массив.
Я попробовал это:
Sequencer.h
/* Declaration de la memory pool */
static char sequencerNoteEvent[2][600] __attribute__((section(".masection")));
static arena<600> arenaa[2] __attribute__((section(".masection")));
static FixedVector v[2] __attribute__((section(".masection")));
Sequencer.cpp
arena<600> Sequencer::arenaa[]{Sequencer::sequencerNoteEvent[0], Sequencer::sequencerNoteEvent[1]};
FixedVector Sequencer::v[]{Sequencer::arenaa[0], Sequencer::arenaa[1]};
error: use of deleted function 'arena<N, alignment>::arena(const arena<N, alignment>&) [with unsigned int N = 600; unsigned int alignment = 4]'
arena<kBytesChunkMax> Sequencer::arenaa[]{Sequencer::sequencerNoteEvent[0], Sequencer::sequencerNoteEvent[1]};
и если я разрешаю конструктор копирования (что, скорее всего, будет плохой идеей)
error: conversion from 'arena<600>' to non-scalar type 'pyrapro::FixedVector' {aka 'std::vector<pyrapro::SequencerNoteEvent, short_alloc<pyrapro::SequencerNoteEvent, 600, 4> >'} requested
FixedVector Sequencer::v[]{Sequencer::arenaa[0], Sequencer::arenaa[1]};
Есть ли у кого-нибудь подсказка другого способа инициализации этого?
РЕДАКТИРОВАТЬ
Большое спасибо за ваш ответ!На самом деле мне нужно создать свои векторы с помощью пользовательских распределителей (short_alloc, которые перенаправляют на арену в моем случае).Поэтому мне нужно, чтобы они были построены на арене.Каждая арена хранит и выделяет массив во внешней оперативной памяти, а short_alloc - это сам пользовательский распределитель, который отвечает требованиям стандарта.
short_alloc(arena_type& a) noexcept : a_(a) {}
Если я не могу изменить распределитель вектора после того, как он уже создан, я не вижу другого решения.
Конструктор перемещения на арене решил часть моей проблемы,у меня все еще есть:
error: conversion from 'arena<600>' to non-scalar type 'pyrapro::FixedVector' {aka 'std::vector<pyrapro::SequencerNoteEvent, short_alloc<pyrapro::SequencerNoteEvent, 600, 4> >'} requested
Когда я делаю это:
FixedVector Sequencer::v0{Sequencer::arena0};
я звоню при инициализации short_alloc (arena_type & a), что нормально.Почему я не могу сделать это несколько раз?
Конечно, если у кого-то есть идея избежать этого огромного списка initializer_list, который я слушаю!
Я позже попытался установить ссылку на арену в классах short_alloc безпока успех.Ссылки не могут быть нулевыми, я не хочу изменять весь этот код, который я не писал с помощью указателей, и инициировать FixedVectors со ссылкой на фиктивную арену приводит к той же самой начальной проблеме.
Спасибо,