使用矢量 如没有初始化它在调整大小的缓冲器()(Using vector as a

2019-07-21 00:02发布

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

封装它。

它初始化到最大尺寸(不公积)。

保持到代表真实尺寸的结束迭代器的参考,如你所说的那样。

使用beginreal end ,而不是end ,你的算法。



文章来源: Using vector as a buffer without initializing it on resize()
标签: c++ boost c++11