C++中vector间赋值拷贝的底层实现:单次memcpy还是多次?
vector赋值操作的底层行为分析
针对你写的vec_a = vec_b;这个vector赋值操作,具体行为取决于元素类型vec_structurename是否符合C++标准里的**可平凡复制(Trivially Copyable)**要求,分两种情况:
一、元素是可平凡复制类型
如果vec_structurename(包括它内部的other_strctuname)满足可平凡复制条件——简单说就是:没有自定义的拷贝构造/赋值运算符、没有虚函数、所有成员都是可平凡复制类型(比如uint16这类基础类型肯定满足)——那么标准库实现会用单次批量内存复制(类似memcpy)来完成整个vector的元素拷贝。
这种情况下,底层直接把vec_b的元素内存块整体复制到vec_a的内存空间里,等价于一次memcpy,而不是循环调用vec_b.size()次单独的memcpy。
二、元素不是可平凡复制类型
如果vec_structurename或者other_strctuname有自定义的拷贝逻辑(比如手写了拷贝构造函数),或者包含非平凡的成员类型,那么vector的赋值操作会逐个处理每个元素:循环调用vec_b.size()次元素的拷贝构造函数,把每个元素从vec_b复制到vec_a。这种情况下不会用批量memcpy,而是执行vec_b.size()次元素级的拷贝操作。
一句话总结
- 元素可平凡复制:单次批量内存复制(等价于一次
memcpy) - 元素不可平凡复制:
vec_b.size()次元素级拷贝操作
内容的提问来源于stack exchange,提问作者srccode
相关产品推荐
相关产品推荐

