为何std::copy比std::string构造函数更快?测试验证与使用疑问
std::copy与std::string构造函数的性能对比分析
测试代码
#include <chrono> #include <iostream> #include <vector> void construct_test() { std::vector<uint8_t> raw_data; for (int i = 0; i < 1000 * 1024; i++) { raw_data.push_back(i % 256); } auto start = std::chrono::high_resolution_clock::now(); std::string target_data; target_data = std::string(raw_data.begin(), raw_data.end()); auto finish = std::chrono::high_resolution_clock::now(); std::cout << "construct: " << std::chrono::duration_cast<std::chrono::microseconds>(finish - start) .count() << "us" << std::endl; } void copy_test() { std::vector<uint8_t> raw_data; for (int i = 0; i < 1000 * 1024; i++) { raw_data.push_back(i % 256); } auto start = std::chrono::high_resolution_clock::now(); std::string target_data; target_data.resize(raw_data.size()); std::copy(raw_data.begin(), raw_data.end(), target_data.begin()); auto finish = std::chrono::high_resolution_clock::now(); std::cout << "copy: " << std::chrono::duration_cast<std::chrono::microseconds>(finish - start) .count() << "us" << std::endl; } int main() { construct_test(); copy_test(); return 0; }
测试结果
construct: 6245us copy: 1087us
问题解答
1. 测试结果是否符合预期?
这个结果不完全符合常规预期,通常两者性能差距不会达到6倍这么大,主要是测试代码的写法放大了差异。
2. 性能差距的核心原因
你的测试代码中,construct_test做了两步额外操作:
- 先临时构造一个
std::string对象 - 再将临时对象移动赋值给
target_data
即便移动赋值开销很低,临时对象的构造、销毁流程仍会带来额外成本。而copy_test的流程更直接:
- 先通过
resize一次性分配好足够内存 - 再用
std::copy直接填充数据
另外,部分编译器对std::copy的优化更激进——针对连续内存的vector和string,std::copy常被直接优化为memcpy这类底层内存拷贝指令;而迭代器构造string的实现,可能额外包含合法性检查(比如部分库会隐性校验字节序列),或构造流程的冗余步骤,进一步拉大了开销差距。
3. 使用std::copy转换vector到string的弊端
- 易出错:必须手动调用
resize分配足够内存,一旦大小写错或遗漏resize,std::copy会直接越界触发未定义行为;而构造函数会自动处理内存分配,无此风险 - 代码冗余:
std::string(raw_data.begin(), raw_data.end())的写法更简洁直观,resize+copy的组合多了额外步骤,可读性差 - 优化受限:部分编译器会对
string的迭代器构造做针对性优化(比如尝试复用内存),但std::copy只能做内存拷贝,无法享受这类优化
内容的提问来源于stack exchange,提问作者Jason.Pu
相关产品推荐
相关产品推荐

