繁体   English   中英

std :: vector <char> 进入std :: vector <T> 转换c ++

[英]std::vector<char> into std::vector<T> conversion c++

我想从长度为len * (sizeof T)std::vector<char>中包含的序列化数据创建长度为lenstd::vector<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 ),如果它们提供这种低开销的类型修剪。

如果没有复制,则不可能从另一种类型中获得一种类型的向量。

通过首先构造T (足够大)的向量,然后不使用chars的中间向量,直接将序列化的数据写入该向量,就可以避免一组副本。

一些警告:

  • 直接复制数据将意味着该数据不能以不同的字节序或其他不同的数字表示形式移植到CPU,因此这种形式的序列化不适用于跨系统的通信(例如网络,共享文件)。
  • T必须是平凡可复制的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM