我想使用 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/15219984/