我想使用 vector<char>
作为缓冲区。该界面非常适合我的需要,但由于内存已初始化,因此将其调整为超出当前大小时会降低性能。我不需要初始化,因为无论如何数据都会被某些第三方 C 函数覆盖。有没有办法或特定的分配器来避免初始化步骤?请注意,我确实想使用 resize()
,而不是其他技巧,如 reserve()
和 capacity()
,因为我需要 size()
随时代表我的“缓冲区”的有效大小,而 capacity()
在 resize()
之后可能大于它的大小,所以,我不能再次依赖 capacity()
作为我申请的重要信息。此外, vector 的(新)大小是事先不知道的,所以我不能使用 std::array
.如果 vector 不能那样配置,我想知道我可以使用哪种容器或分配器来代替 vector<char, std::alloc>
.唯一的要求就是vector的替代品最多只能是基于STL或者Boost。我可以访问 C++11。
最佳答案
这是一个已知问题,即对于 std::vector
甚至无法显式关闭初始化。 .
人们通常会实现自己的 pod_vector<>
不对元素进行任何初始化。
另一种方法是创建一个与 char 布局兼容的类型,其构造函数不执行任何操作:
struct NoInitChar
{
char value;
NoInitChar() noexcept {
// do nothing
static_assert(sizeof *this == sizeof value, "invalid size");
static_assert(__alignof *this == __alignof value, "invalid alignment");
}
};
int main() {
std::vector<NoInitChar> v;
v.resize(10); // calls NoInitChar() which does not initialize
// Look ma, no reinterpret_cast<>!
char* beg = &v.front().value;
char* end = beg + v.size();
}
关于c++ - 使用 vector<char> 作为缓冲区而不在 resize() 上初始化它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38362926/