c++ - 使用 vector<char> 作为缓冲区而不在 resize() 上初始化它

标签 c++ boost c++11

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

相关文章:

c++ - 存储、解析和执行存储的成员函数

c++ - 基于范围的 for with range_expression 从 std::vector 返回非空项

c++ - 有人能解释一下 & 和 && 之间的区别吗?

c++ - 使用SFINAE分辨率区分普通模板参数和模板模板参数的技术

c++ - 如何使用C++通过电子邮件发送数据

c++ - C++ 中的类型转换和异常处理

c++ - Qt:在窗口后面模糊

c++ - 在哪里可以找到 boost::fusion 文章、示例、指南、教程?

c++ - 将字符串变量传递给 boost::ASIO 读取器/处理程序会导致段错误

c++ - 如何在不删除对象的情况下从 boost::ptr_vector 中删除指针?