gpt4 book ai didi

c++ - std::vector 到 std::vector 转换 c++

转载 作者:行者123 更新时间:2023-11-30 01:35:19 26 4
gpt4 key购买 nike

我想创建一个 std::vector<T>长度len来自 std::vector<char> 中包含的序列化数据长度len * (sizeof T) ,在不需要时不复制数据(例如,可能无法对齐 T 的要求)。换句话说,我寻找以下代码的优化,以相同的保证运行:

template<typename T>
auto copyStuff(std::vector<char>&&input) {
std::vector<T> result;
result.resize(input.size()/(sizeof T));
for (int i=0; i < result.size(); i++) {
memcpy(&result[i], &input[i * (sizeof T)], sizeof T);
}
return result;
}

哪个

  • 尽可能避免复制
  • 否则复制单个memcpy中的所有字节可能的话打电话
  • 或者在两者都不可能时回退到上面的实现或等价物。

是否有标准方法或可移植库来实现此目的(或“足够好”的近似值)?

说明:

  • 我需要能够只假设 T是简单可复制的,输入的布局 std::vector<char>只是我要构建的项目的内存表示的串联。
  • 我正在寻找一种方法来确保在进行优化时不会出现未定义或实现定义的行为
  • 如果非标准容器库(而不是 vector s)提供这种低开销类型双关语,我愿意考虑它们。

最佳答案

如果不进行复制,就不可能从另一种类型中获取一种类型的 vector 。

您可以通过首先构建 T vector (足够大)来避免一组拷贝,然后将序列化数据直接写入该 vector 而不使用中间的字符 vector 。

一些注意事项:

  • 直接复制数据意味着数据无法移植到具有不同字节顺序或其他不同数字表示形式的 CPU,因此这种序列化形式不适合跨系统通信(例如网络、共享文件)。<
  • T 必须是普通可复制类型。

关于c++ - std::vector<char> 到 std::vector<T> 转换 c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54426709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com