我想使用vector<char>
作为缓冲剂。 接口非常适合我的需求,但调整其大小,当超过其目前的规模,因为内存初始化有性能损失。 我不需要初始化,因为数据在任何情况下,通过一些第三方的C函数被覆盖。 有没有一种方法或特定的分配,以避免初始化步骤? 请注意,我想用resize()
而不是其他的技巧,比如reserve()
和capacity()
因为我需要size()
始终代表我的“缓冲”在任何时刻的有意义的大小,而capacity()
可能是大于后的大小resize()
所以,再一次,我不能靠capacity()
作为我的应用程序有意义的信息。 Furthemore,向量的(新的)大小是从来没有预先已知的,所以无法使用std::array
。 如果向量不能这样配置的,我想知道我可以转而使用什么样的容器或分配器的vector<char, std::alloc>
唯一的要求是,该替代向量必须至多基于STL或升压。 我有机会获得C ++ 11。
Answer 1:
没有什么在符合您要求的标准库,并没有什么我升压知道任。
还有我能想到的三个合理选择:
- 坚持使用
std::vector
现在,留在代码中的注释,然后回来,如果这个曾经引起你的应用程序的瓶颈。 - 使用空自定义分配器
construct
/destroy
方法-并希望你的优化器将是足够聪明,以消除任何调用它们。 - 围绕AA动态分配的数组创建一个包装,只实现您需要的最小功能。
Answer 2:
这是一个已知的问题,初始化不能甚至明确地关闭了std::vector
。
通常人们实现自己的pod_vector<>
那不元素的任何初始化。
另一种方法是创建一个类型,是布局兼容字符,它的构造不执行任何操作:
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();
}
Answer 3:
封装它。
它初始化到最大尺寸(不公积)。
保持到代表真实尺寸的结束迭代器的参考,如你所说的那样。
使用begin
和real end
,而不是end
,你的算法。
文章来源: Using vector as a buffer without initializing it on resize()