我需要某种表现类似于std::vector
(接口/功能/等)的东西,但我需要它是扁平的,即它不能动态分配缓冲区。显然,这通常不起作用,因为必须在编译时确定可用大小。但是我希望该类型能够在没有其他分配的情况下处理N
对象,并且仅当有更多项目被推送时才采用动态分配。
std::vector
的某些实现已经做到了这一点,但是仅在内容的累积大小合适的情况下使用现有成员的程度(我相信有效载荷的指针为三个指针)。因此,firstly,这不是保证,并且secondsecond,在编译时是不可配置的。
我的想法是我可以
vector
中可笑的性能优化选项)variant<vector<T>,array<T,N>>
和访问包装器(哦,样板)MyAllocator<T,N>
成员的array<T,N>
,该成员随后可用于保存前N
个项目,此后推迟到allocator<T>
,但我不确定是否这行得通,因为我无法确定vector
是否必须作为成员永久持有其分配器类型的实例(我相信不是)我想我不是第一个想要这个的人,所以也许已经有解决办法了?一些经验值甚至免费的图书馆?
您可能希望在变量中使用类似struct { alignas(T) std::byte storage[sizeof(T) * N]; std::size_t count; }
的形式而不是数组,因此您不必初始化所有值。
如果决定自己滚动,也必须在向量中存储分配器的实例。
您也可以尝试创建一个为您执行此操作的分配器,例如,如果指针有空间,则返回指向堆栈上某个缓冲区的指针,否则返回另一个分配器。它可能会有一些API,例如:
// Tweak size depending on how your standard library reserves memory
memory_buffer<sizeof(T) * 2 * N> buf;
std::vector<T, fallback_allocator<T>> vec(fallback_allocator<T>{buf});
vec.reserve(N);
而且这还有一个优势,您可以在其他容器中使用它,并且可能有一些提供此功能的库。