在哪种情况下std :: vector.clear()会调用析构函数?

时间:2013-08-14 01:53:13

标签: c++ malloc stdvector

我遇到了在大型向量上调用std :: vector.clear()的问题,n> 1,000,000需要很多秒。

它目前是std :: vector of structs,它们基本上都是POD。析构函数中不需要清理。我已经考虑过将结构更改为类,因为我想为它们添加一些函数,但我不确定这会如何影响在大量这些类/结构的向量上调用clear。

归结为想要知道std :: vector.clear()何时会调用析构函数。我的印象是,这些天C ++中的类和结构之间没有区别,而结构成员默认为public。

我讨厌不得不切换到使用malloc,realloc并释放自己并跟踪大小只是因为我想保证析构函数不被调用,但似乎我正在服用即使在调用clear()时性能也会受到影响。

1 个答案:

答案 0 :(得分:3)

在struct和class之间切换不会有任何区别 - 你是正确的,它们之间的唯一区别是默认可见(对于结构是公共的,对于类是私有的)。

重要的是容器中的物品是否具有非平凡的析构函数。如果它们是非平凡的,它们将被调用。如果它们是微不足道的,那么(至少一般来说)将不会真正地 调用任何东西。

如果没有任何关于当前代码的真实想法和/或正在消耗的时间,提供关于如何加快速度的正确建议有点困难。在你的位置,我会考虑分析代码。一旦你确切知道哪里花费的时间,你就有可能改善一些事情 - 但在那之前,你几乎是在黑暗中拍摄 - 你可能会尝试改进一些事情(几乎)没有时间开始,所以你的改进没有任何区别,或者你可能会做一些重要的事情,但最终会让它变慢而不是更快。