我正在尝试以尽可能少的开销将数据从另一个移动QByteArray到另一个。std::vector<char>
目前我找到了4种方法,哪一种的性能最好呢?有更好的解决方案吗?您希望在代码审查中看到哪一个?
#include <QDebug>
#include <vector>
int main() {
auto b = QByteArray("hello");
std::vector<char> v;
// 1
v = std::vector<char>(*b.data(),b.size());
// 2
v = std::vector<char>(b.begin(),b.end());
// 3
std::move(b.begin(),b.end(),std::back_inserter(v));
// 4
v.resize(b.size());
std::memcpy(&v[0],b,b.size());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
只需使用您的cbegin和迭代器初始化向量:cendQByteArray
int main() {
QByteArray b("hello");
std::vector<char> v(b.cbegin(), b.cend());
}
Run Code Online (Sandbox Code Playgroud)
这会将数据复制到b其中v,并且是您可以获得的最佳选择。
使用cbeginand很重要cend,因为QByteArray使用写时复制来避免在复制对象时复制其基础数据,直到其中一个副本对其执行了一些潜在的修改操作。由于数据可以通过非常量begin和方法返回的迭代器进行修改,如果您要复制的数据本身之前已被复制过,end那么它们可能会导致数据被额外复制一次。QByteArray
由于QByteArray::iteratoris 是一个随机访问迭代器,v在从 复制数据之前会自动预先分配足够的空间b,因此无需手动分配reserve空间。
另外,由于char是一种简单的类型,因此使用std::move.
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |