std::vector在Windows与Linux下前置Node对象的行为差异问询
关于std::vector前置插入Node对象时的扩容拷贝行为分析
测试方案
为了追踪std::vector前置插入含long成员的Node对象时的扩容迁移拷贝次数,我做了如下设置:
- 给
Node类添加静态计数器,在拷贝构造函数中自增,以此统计拷贝调用次数 - 同时统计对象的总创建次数、销毁次数,以及插入100个对象的耗时
- 测试操作:循环调用
vector.insert(vector.begin(), Node{...})完成前置插入
跨平台测试结果
Windows + MinGW编译器
| --------------------Vector------------------- |
|---|
| Size |
| 100 |
Linux平台
| --------------------Vector------------------- |
|---|
| Size |
| ... |
结果分析
- 前置插入是
std::vector的低效操作:每次插入都需要将当前所有元素向后移动(拷贝到新位置),而当vector容量不足触发扩容时,还需要一次性拷贝所有现有元素到更大的内存块,这两次操作的拷贝次数会累积 - Windows MinGW的测试数据中,100次前置插入导致了411次拷贝构造调用,正好印证了这种累积效应——多次扩容加上每次插入的全量元素移动,共同推高了拷贝次数
- 创建次数100对应我们插入的100个原始对象,销毁次数和拷贝次数一致,说明所有拷贝产生的临时对象/迁移对象都被正确析构,没有内存泄漏风险
内容的提问来源于stack exchange,提问作者Seto Kaiba
相关产品推荐
相关产品推荐

