【发布时间】:2019-04-05 15:23:18
【问题描述】:
我需要使用自定义分配器初始化的静态向量数组,以便将我的数据(每个 16 字节)存储在外部 ram 中。我使用Howard Hinnant short alloc 这样做,到目前为止一切顺利。
我使用 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]};
有人知道另一种初始化方法吗?
编辑
非常感谢您的回答! 实际上,我需要使用自定义分配器(在我的情况下重定向到 arena 的 short_alloc)来实例化我的向量。所以我需要他们建造一个竞技场。每个 arena 在外部 RAM 内存中存储和分配一个数组,short_alloc 是符合标准要求的自定义分配器本身。
short_alloc(arena_type& a) noexcept : a_(a) {}
除非我可以在构造向量后更改它的分配器,否则我看不到任何其他解决方案。
arena 中的移动构造函数解决了我的部分问题,我仍然有:
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 会导致相同的初始问题。
谢谢,
【问题讨论】:
-
当您使用
FixedVector::allocator_type::arena_type而不是arena时会发生什么? -
嗨,它不会改变任何东西。我的编译器似乎很好理解发生了什么,我认为这是我不理解的人:)。
标签: c++ arrays static allocator