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/38362926/

相关文章:

c++ - boost::property_tree : 解析复杂的xml结构

c++ - 为什么 char 在数组中占用的空间似乎比它本身占用的空间更多

c++ - 为什么std::fetch_add返回旧值?

c++ - 如何在类的构造函数中定义成员 vector 的大小?

elasticsearch - 通过整数字段 boost 结果

c++ - 发送 URL 时 chrome 中的奇怪字符

c++ - 编写一个可以用作静态但需要锁的 C++ 类

c++ - 如果从析构函数调用纯虚函数是UB,为什么我们可以使用纯虚析构函数?

c++ - BOOST_FOREACH : What is the error on using this of a STL container?

c++ - 如何制作 boost.Test 日志/打印标准类型