我有一个游戏,其中某些游戏对象一次性产生,然后在它们被摧毁/杀死时消失。游戏对象是std::vector
中的元素,我想最小化内存使用量。我习惯了交换技巧,
std::vector<gameObject>(gameObjectVector.begin(), gameObjectVector.end()).swap(gameObjectVector);
但我注意到C ++ 11中的内置shrink_to_fit()
。但是,它具有线性复杂性,而交换技巧是不变的。交换技巧在各方面都不是优越的吗?
答案 0 :(得分:16)
交换技巧实际上不是恒定时间。执行实际交换的成本确实是O(1),但是std::vector
析构函数的成本会触发并清理所有已分配的空间。如果底层对象具有非平凡的析构函数,那么可能会花费Ω(n),因为std::vector
需要去调用那些析构函数。还有为初始向量中存储的所有元素调用复制构造函数的成本,类似于Ω(n)。
因此,两种方法应该具有大致相同的复杂性,除了shrink_to_fit
更明确地表达意图并且可能更适合编译器优化。
答案 1 :(得分:3)
在isocpp.org上也有特色的接受的答案是错误的。
shrink_to_fit
nonbinding 要求。
我个人认为,将ISO视为非限制性(不提供对发生的事情提供更强有力的保证)是非常愚蠢的,因为它令人困惑,但也许他们有充分的理由(tm)。