如何最好地对一个(一维)矢量强制平整N个值?

问题描述 投票:1回答:1

我需要某种表现类似于std::vector(接口/功能/等)的东西,但我需要它是扁平的,即它不能动态分配缓冲区。显然,这通常不起作用,因为必须在编译时确定可用大小。但是我希望该类型能够在没有其他分配的情况下处理N对象,并且仅当有更多项目被推送时才采用动态分配。

std::vector的某些实现已经做到了这一点,但是仅在内容的累积大小合适的情况下使用现有成员的程度(我相信有效载荷的指针为三个指针)。因此,firstly,这不是保证,并且secondsecond,在编译时是不可配置的。

我的想法是我可以

  • A)自煮一个类型(可能很糟糕,因为我放弃了vector中可笑的性能优化选项)
  • B]使用某种variant<vector<T>,array<T,N>>和访问包装器(哦,样板)
  • C)提出一个具有MyAllocator<T,N>成员的array<T,N>,该成员随后可用于保存前N个项目,此后推迟到allocator<T>,但我不确定是否这行得通,因为我无法确定vector是否必须作为成员永久持有其分配器类型的实例(我相信不是)

我想我不是第一个想要这个的人,所以也许已经有解决办法了?一些经验值甚至免费的图书馆?

c++ dynamic-memory-allocation stdvector allocator
1个回答
0
投票

您可能希望在变量中使用类似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);

而且这还有一个优势,您可以在其他容器中使用它,并且可能有一些提供此功能的库。

© www.soinside.com 2019 - 2024. All rights reserved.