【问题标题】:How to append raw bytes to std::vector?如何将原始字节附加到 std::vector?
【发布时间】:2020-05-27 00:22:05
【问题描述】:

我想像这样将原始字节附加到vector

vector.reserve(current_size + append_data_size);
memcpy(append_data, vector.data() + current_size, append_data_size);
vector.resize(current_size  + append_data_size) // Expect only set size to current_size + append_data_size.

下面是不是比较慢?因为我认为向量首先初始化为默认值,然后设置浪费的数据。

vector.resize(current_size  + append_data_size);
memcpy(append_data, vector.data() + current_size, append_data_size);

【问题讨论】:

  • resize 放大一个向量时,它会创建新值(即使它们已经有空间)。 reserve 操作只是腾出空间。
  • 如果你想给一个vector添加数据,使用它的接口。例如vector.insert(iter_pos_into_vec, start_of_range_to_copy, end_of_range_to_copy)
  • 你说你想追加,但你正在使用memcmp()!?另外,n 是什么?为什么n + 100 会变成100
  • @UlrichEckhardt 谢谢!这是一个错字,
  • 现在,检查memcpy() 的参数。这正是您需要提供minimal reproducible example 的原因,顺便说一句。它避免了无法编译且不起作用的代码,从而混淆了问题。

标签: c++ performance vector


【解决方案1】:

即使你调用reserve,如果你想访问新元素,你仍然必须在向量上调用resize,否则你的代码的行为是未定义的reserve可以做的是让push_back和其他类似的操作更有效率。

我个人不会关心任何此类优化,除非您可以使用适当的分析工具证明它们有效果。通常,摆弄std::vector 的容量是没有意义的。

同样使用memcpy 是危险的。 (例如,不会调用复制构造函数,例如,了解在具有 memcpy 的结构中复制填充的确切行为是提高您在此站点上的声誉的可靠方法!)改用 insert 并相信编译器会优化视情况而定。

没有显式附加参数,std::vector::resize 值初始化任何附加成员。通俗地说,这意味着 T 中的 std::vector 的元素被设置为与 static T t; 中的 t 相同的值。

【讨论】:

    【解决方案2】:

    修改向量存储超出其大小是未定义的行为,随后的resize 将在存储结束时初始化新元素。

    但是,您可以改用insert

    vector.insert(vector.end(), bytes, bytes + size);
    

    【讨论】:

    • 请注意,这将从decltype(*bytes) 转换为vector::value_type,而memcpy 将复制原始位。
    • 对。而且insertmemcpy 不一样,我打赌你想要insert
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2020-08-17
    • 1970-01-01
    • 2014-04-18
    • 2023-03-06
    相关资源
    最近更新 更多