我有一个游戏,其中某些游戏对象一次全部生成,然后在它们被摧毁/杀死时消失。游戏对象是 std::vector
中的元素,我想尽量减少内存使用。我习惯了交换技巧,
std::vector<gameObject>(gameObjectVector.begin(), gameObjectVector.end()).swap(gameObjectVector);
但我注意到了来自 C++11 的内置 shrink_to_fit()
。但是,它具有线性复杂性,而交换技巧是恒定的。交换技巧不是在各方面都优越吗?
最佳答案
交换技巧实际上并不是恒定时间。执行实际交换的成本确实是 O(1),但是还有 std::vector
析构函数触发和清理所有分配空间的成本。如果底层对象有非平凡的析构函数,这可能会花费 Ω(n),因为 std::vector
需要去调用这些析构函数。还有为存储在初始 vector 中的所有元素调用复制构造函数的成本,也就是 Ω(n)。
因此,这两种方法应该具有大致相同的复杂性,除了 shrink_to_fit
更清楚地传达了意图并且可能更适合编译器优化。
关于c++ - shrink_to_fit() 与交换技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43667175/